Apache ProxyPassReverse未正确重写位置头

Apache ProxyPassReverse未正确重写位置头,apache,mod-rewrite,reverse-proxy,mod-proxy,mod-ssl,Apache,Mod Rewrite,Reverse Proxy,Mod Proxy,Mod Ssl,我正在配置apache以将SSL请求代理到本地后端服务器。以下是虚拟主机的相关部分: <VirtualHost *:443> ... SSLEngine on SSLCertificateFile /path/to/server.crt SSLCertificateKeyFile /path/to/server.key RewriteEngine On <Proxy balancer://unicornservers> Balanc

我正在配置apache以将SSL请求代理到本地后端服务器。以下是虚拟主机的相关部分:

<VirtualHost *:443>

  ...

  SSLEngine on
  SSLCertificateFile /path/to/server.crt
  SSLCertificateKeyFile /path/to/server.key

  RewriteEngine On

  <Proxy balancer://unicornservers>
    BalancerMember http://127.0.0.1:8080
  </Proxy>

  # Redirect all non-static requests to unicorn
  RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f
  RewriteRule ^/(.*)$ balancer://unicornservers%{REQUEST_URI} [P,QSA,L]

  ProxyPassReverse / balancer://unicornservers/
  ProxyPreserveHost on

  ...

</VirtualHost>

...
斯伦金安
SSLCertificateFile/path/to/server.crt
SSLCertificateKeyFile/path/to/server.key
重新启动发动机
平衡员http://127.0.0.1:8080
#将所有非静态请求重定向到unicorn
重写cond%{DOCUMENT\u ROOT}/%{REQUEST\u FILENAME}-F
重写规则^/(.*)$balancer://unicornservers%{REQUEST_URI}[P,QSA,L]
ProxyPassReverse/balancer://unicornservers/
代理主机
...
当我使用curl访问服务器时(
curl-vkhttps://example.com
),后端服务器按照预期执行重定向到
/login

问题是,apache没有正确地重写
位置
头。它返回
http://example.com/login
而不是
https://example.com/login


在我的配置中是否有某个地方我需要告诉apache使用
https
进行
ProxyPassReverse
重写?

结果表明我没有正确地诊断出这一点。后端Web服务器(在本例中,它恰好是rails)实际上明确指定了
http
URL。这是因为它使用传入请求参数来构建其重定向URL。因此,由于启用了
ProxyPreserveHost
,因此它得到的是正确的主机,而不是协议

为了修复它,我在apache配置中添加了以下行:

RequestHeader set X-Forwarded-Proto "https"
这样,后端rails服务器就知道原始请求是通过SSL的,并正确地生成重定向URL