Apacheredirect到SSL终止代理之后

我在<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的问题是:

  1. http://example.com/foo正确地redirect到http://example.com/bar
  2. https://example.com/foo错误地redirect到http://example.com/bar

我怎样才能确保httpredirect到httphttpshttps ? 请注意,我想避免不得不重写两次redirect规则。 我如何使用X-Forwarded-ProtoX-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}部分。