我有以下重定向<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 }
我对重定向的问题是:
- http://example.com/foo正确重定向至http://example.com/bar
- https://example.com/foo错误地重定向到http://example.com/bar
我如何确保http
重定向到和http
?请注意,我想避免编写两次重定向规则。我如何使用或重定向到正确的方案?https
https
X-Forwarded-Proto
X-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}