我在<VirtualHost *:80>有以下redirect:
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 }
我对redirect的问题是:
我怎样才能确保httpredirect到http和https到https ? 请注意,我想避免不得不重写两次redirect规则。 我如何使用X-Forwarded-Proto或X-Forwarded-Portredirect到正确的scheme?
由于redirect将始终包含绝对url,因此您需要将redirect设置为完整url,如下所示:
RewriteEngine On RewriteRule "^/foo" "%{HTTP:X-Forwarded-Proto}://%{HTTP_HOST}/bar" [R=301]
为了在任何情况下都能正常工作,需要确保X-Forwarded-Proto总是正确的,所以它应该包含用于简单HTTP连接的“http”(我相信haproxy没有明确地设置,所以你会需要这样做)。 此外,Apache服务器应该收到一个Host:头,所以如果haproxy通过IP调用Apache服务器,那么您需要用实际的主机名replace%{HTTP_HOST}部分。