在將 HTTPS 和非 www 的這些規則添加到.htaccess頂部檔案后,我正在嘗試修復此錯誤
RewriteEngine on
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [L,NE,R=301,QSA]
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule (.*) https://www.%{HTTP_HOST}%{REQUEST_URI} [L,NE,R=301,QSA]
它確實修復了 HTTPS 和非 www,但它搞砸了這個規則
RewriteRule ^product/([0-9] )$ product.php?p=$1 [NC,L,QSA]
現在,只要沒有 HTTPS 或沒有 www,它就會更改此 URL
- 從 :
www.example.com/product/2443 - 到 :
www.example.com/product.php/2443?p=2443
我希望它再次回到這個:
www.example.com/product/2443
uj5u.com熱心網友回復:
聽起來您將指令的順序錯誤。.htaccess在內部重寫之前,您的規范重定向(HTTP 到 HTTPS 和非 www 到 www)需要位于檔案的頂部。
此外,由于您在內部重寫到與請求的 URL 路徑具有相同基本名稱的檔案,您需要確保禁用 MultiViews 以防止 mod_negotiation/product.php/2443在 mod_rewrite 能夠處理請求之前在內部發出子請求。例如,在.htaccess檔案頂部添加以下內容以確保禁用 MultiViews:
Options -MultiViews
您需要清除瀏覽器快取,因為這些錯誤(301 - 永久)重定向將被瀏覽器快取。
在旁邊:
RewriteCond %{HTTPS} off RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [L,NE,R=301,QSA] RewriteCond %{HTTP_HOST} !^www\. [NC] RewriteRule (.*) https://www.%{HTTP_HOST}%{REQUEST_URI} [L,NE,R=301,QSA]
在請求 HTTP 非 www 時,顛倒這兩個規則以避免雙重重定向。但是,如果您計劃實施 HSTS,則應保留這些內容。
QSA這些規則中的任何一條都不需要該標志。
并且捕獲RewriteRule 模式(即(.*))是多余的。只使用^(or $) - 一個斷言會更有效- 因為它只需要對所有事情都成功,它不需要實際匹配任何東西。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/406113.html
標籤:
