Apache-2.2

Apache 在 SSL 終止代理後面重定向

  • December 29, 2016

我在以下重定向<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 }

我對重定向的問題是:

  1. http://example.com/foo>正確重定向到<http://example.com/bar
  2. https://example.com/foo>錯誤地重定向到<http://example.com/bar

如何確保http重定向到httphttpshttps?請注意,我想避免兩次編寫重定向規則。我如何使用X-Forwarded-ProtoorX-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}部分替換為實際的主機名。

引用自:https://serverfault.com/questions/822869