Apache-2.2
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 }
我對重定向的問題是:
- 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,如下所示:
RewriteEngine On RewriteRule "^/foo" "%{HTTP:X-Forwarded-Proto}://%{HTTP_HOST}/bar" [R=301]
為了在所有情況下都能正常工作,您需要確保 X-Forwarded-Proto 始終正確,因此它應該包含用於簡單 HTTP 連接的“http”(我相信 haproxy 沒有明確設置它,所以你會需要這樣做)。此外,Apache 伺服器應該收到一個
Host:
標頭,因此如果 haproxy 通過 IP 呼叫 Apache 伺服器,那麼您需要將%{HTTP_HOST}
部分替換為實際的主機名。