Apache-2.2

將資產請求重定向到 https,以及用於漂亮 URL 的 mod_rewrite

  • September 27, 2017

我在將所有請求更改為 https 時遇到問題,同時將以下內容用於漂亮的 URL:

RewriteEngine On
RewriteBase /
RewriteRule ^/?([-_a-zA-Z0-9]+)$ /?p=$1
RewriteRule ^/?([-_a-zA-Z0-9]+)/([-_a-zA-Z0-9]+)$ /?par=$1&p=$2 [L]

我嘗試在上面直接添加以下內容(並刪除上面的 L 指令),但出現重定向錯誤:

RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

我在這裡做錯了什麼?

RewriteCond %{HTTP:X-Forwarded-Proto} !https

X-Forwarded-Proto頭僅由代理伺服器(或惡意客戶端)設置,因此,除非您使用某種 SSL 代理,否則您不應該使用它(如果這樣做,可能會導致重定向循環)。

任何規範的重定向(HTTP 到 HTTPS 和/或非 www 到 www)都應該出現您的內部重寫之前。

請嘗試以下方法:

RewriteEngine On
RewriteBase /

RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=302,L]

RewriteRule ^/?([-\w]+)$ /?p=$1 [L]
RewriteRule ^/?([-\w]+)/([-\w]+)$ /?par=$1&p=$2 [L]

我已將L標誌添加到您的第一個內部重寫中。

\w只是 . 的簡寫字元類[_a-zA-Z0-9]

(如果是這樣,.htaccess則不需要模式/?上的前綴。)RewriteRule

僅當您確定它工作正常時才將302(臨時)重定向更改為(永久),以避免在測試時出現記憶體問題。301在測試之前,您需要確保瀏覽器記憶體已清除。

理想情況下,您還應該在此處規範 www / non-www,而不是依賴規範的元標記。這可以與上述 HTTP 到 HTTPS 重定向結合使用。例如,重定向到 www:

RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [R=302,L]

RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=302,L]

但是,此特定重定向確實假定您沒有任何其他子域。

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