我在以下重定向<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
orX-Forwarded-Port
重定向到正确的方案?
由于重定向将始终包含绝对 URL,因此您需要将重定向设置为完整 URL,如下所示:
为了在所有情况下都能正常工作,您需要确保 X-Forwarded-Proto 始终正确,因此它应该包含用于简单 HTTP 连接的“http”(我相信 haproxy 没有明确设置它,所以你会需要这样做)。此外,Apache 服务器应该收到一个
Host:
标头,因此如果 haproxy 通过 IP 调用 Apache 服务器,那么您需要将%{HTTP_HOST}
部分替换为实际的主机名。