4

我正在将 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>

当我使用 curl 访问服务器 ( ) 时,后端服务器按预期curl -vk https://example.com执行重定向到 。/login

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

我的配置中是否有需要告诉 apachehttps用于ProxyPassReverse重写的地方?

4

1 回答 1

4

原来我没有正确地诊断出这个。后端网络服务器(在这种情况下,它恰好是 rails)实际上是http明确指定 URL。这是因为它使用传入的请求参数来构建其重定向 URL。因此,由于ProxyPreserveHost启用,它使主机正确,但不是协议。

为了解决这个问题,我在我的 apache 配置中添加了以下行:

RequestHeader set X-Forwarded-Proto "https"

这样,后端 Rails 服务器就知道原始请求是通过 SSL 进行的,并且它会正确生成重定向 URL。

于 2015-05-07T16:13:54.123 回答