Apache 在 SSL 终止代理后面重定向

Apache 在 SSL 终止代理后面重定向

我有以下重定向<VirtualHost *:80>

RewriteRule ^/old-url$  /new-url  [R=301,L]
RewriteRule ^/foo$      /bar      [R=301,L]
...

在 apache 前面我有 haproxy,监听 80 和 443,后者执行 SSL 终止并且:

http-request set-header X-Forwarded-Port %[dst_port]
http-request set-header X-Forwarded-Proto https if { ssl_fc }

我对重定向的问题是:

  1. http://example.com/foo正确重定向至http://example.com/bar
  2. https://example.com/foo错误地重定向到http://example.com/bar

我如何确保http重定向到和http?请注意,我想避免编写两次重定向规则。我如何使用或重定向到正确的方案?httpshttpsX-Forwarded-ProtoX-Forwarded-Port

答案1

由于重定向始终包含绝对 URL,因此您需要将重定向设置为完整 URL,如下所示:

RewriteEngine On
RewriteRule "^/foo" "%{HTTP:X-Forwarded-Proto}://%{HTTP_HOST}/bar" [R=301]

为了在所有情况下都能正常工作,您需要确保 X-Forwarded-Proto 始终正确,因此对于简单的 HTTP 连接,它应该包含“http”(我相信 haproxy 没有明确设置它,因此您需要这样做)。此外,Apache 服务器应该收到一个标头,因此如果 haproxy 通过 IP 调用 Apache 服务器,那么您需要用实际主机名Host:替换该部分。%{HTTP_HOST}

相关内容