Apache ProxyPassReverse 未正确重写 Location header

标签 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>
    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改写?

最佳答案

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

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

RequestHeader set X-Forwarded-Proto "https"

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

关于Apache ProxyPassReverse 未正确重写 Location header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30104657/

相关文章:

wordpress - VirtualBox WordPress 重定向到端口 80

Apache 目录列表

ubuntu - 如何在 ubuntu DigitalOcean 上配置 Apache2 以正确重定向除一条路径之外的所有路径

reactjs - Nginx 反向代理和多个 React 应用程序

nextcloud 的 Nginx 反向代理不起作用

python - Django 同一项目在一台服务器上多次

apache - Apache2 提供的 HTTPS 请求比通过反向代理慢

php - 如何更改 GET 变量在 php 中的工作方式

wordpress - 如何用 %23 重写 URL?

docker - docker组成了nginx反向代理,未将容器添加到docker0网桥