如何將流量重定向到http

如何將流量重定向到http

我有一個可以運行 HTTPS 的代理下的 apache 伺服器。它不傳送 HTTPS=on 標頭,而是傳送 HTTP_X_FORWARDED_PROTO=https。

我想寫一個 .htaccess 規則,將所有請求從 https 重定向到 http,除非 URL 是 /user/login。

我想出的是圍繞這些線(它會無限循環):

RewriteCond %{HTTP:http_x_forwarded_proto} !http
RewriteRule ^ http://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

答案1

您的重定向規則的問題可能是您重複了“http_”前綴。這應該沒有必要。如果您的伺服器前面有反向代理(例如 F5 或 nginx),則標頭將為“X-Forwarded-Proto”,有時為“X-Forwarded_Proto”。要在重寫規則中引用這些,請使用 %{HTTP:Name-Of-Header} (大小寫不敏感)。

對於在所有情況下都有效的最強大的重寫,請使用以下內容:

# Make sure all SSL pages for dot-com are redirected to HTTP.
RewriteCond %{SERVER_PORT} 443 [OR]
RewriteCond %{HTTPS} on [OR]
RewriteCond %{HTTP:X-Forwarded-Proto} https [OR]
RewriteCond %{HTTP:X-Forwarded_Proto} https
RewriteRule (.*) http://%{HTTP_HOST}/$1 [R=301,L]

有關在 RewriteCond 中使用標頭的更多詳細信息,請參見Apache mod_rewrite 文檔

答案2

我認為你的初始條件的問題是你有 !http 而不是 !=http。這可能會修復無限循環。

    RewriteEngine On
    RewriteCond %{HTTP:http_x_forwarded_proto} !=http
    RewriteCond %{REQUEST_URI} !^/user/login.*
    RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

這應該接受任何不是 /user/login 的 https 請求並將其重寫為 http。不過,我確信有一種更優雅的方法可以做到這一點。例如,您可以擺脫 RewriteCond %{HTTP:http_x_forwarded_proto} !=http ,它可能也能正常工作,因為它應該接受傳遞給它的任何不包含 /user/login 的請求並將其重定向到 http。

相關內容