【问题标题】:Apache ProxyPassReverse not rewriting Location header properlyApache ProxyPassReverse 未正确重写 Location 标头
【发布时间】:2015-07-18 05:42:39
【问题描述】:

我正在配置 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

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

【问题讨论】:

    标签: apache mod-rewrite reverse-proxy mod-proxy mod-ssl


    【解决方案1】:

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

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

    RequestHeader set X-Forwarded-Proto "https"
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-27
      • 2013-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-12
      • 2013-01-05
      • 1970-01-01
      相关资源
      最近更新 更多