P粉0225014952023-09-02 09:45:36
這與 PHP 版本無關 - 你的規則顯然衝突...
因為第一條規則中的正規表示式太籠統(它符合/s/foo/
),如果您簡單地新增第二條規則,那麼第一條規則仍然會捕獲所有請求並重寫為search.php?feq=foo&key=
而不管路徑段的數量。您需要更具體地使用正規表示式。例如,僅匹配整個路徑段,而不是字面上的任何:
RewriteRule ^s/([\w-]+)/([^/]*)$ search.php?feq=&key= [QSA,L] RewriteRule ^s/([\w-]+)/([^/]+)/([^/]*)$ search.php?feq=&city=&key= [QSA,L] RewriteRule ^s/([\w-]+)/([^/]+)/([^/]+)/([^/]*)$ search.php?feq=&pro=&city=&key= [QSA,L]
請注意 [^/]
(除 /
之外的任何內容)而不是 .
(任何內容)。也可以在強制路徑段中使用
(1 個或多個)。
與您的原始規則一樣,key
URL 參數(即第一個規則中的第二個路徑段和後續規則中的最後一個路徑段)是可選。這是故意的嗎?
如果您知道這些 URL 參數中允許使用的字符,則應在正規表示式中指出這些字符,以進一步限制 URL,否則會被(錯誤地)重寫。
您也可以顛倒指令的順序來解決眼前的問題,但這只是部分解決方案,因為您的正規表示式仍然太通用。
如上所述。但 CSS 和圖片失敗可能是由於在客戶端 HTML 中使用這些資源的相對 URL 路徑造成的。您正在從不同的路徑深度重寫請求,因此您必須使用靜態資源的根相對(或絕對)URL。相對 URL 自然會(由瀏覽器)相對於瀏覽器網址列中的 URL 進行解析。
(作為解決方法,您可以在head
部分中設定base
元素,以指示所有相對URL 都是相對的基本URL 路徑相對 到,但這並非沒有警告。)
有關丟失資產的進一步閱讀:
#另請注意,您的「登陸頁」規則必須位於「搜尋頁」規則之後,否則它們也會發生衝突。同樣,可以透過讓正規表示式更加具體來避免這種衝突。例如,透過將「著陸頁」中的第一個路徑段(name
URL 參數的值)設為2 個或更多字符,而不是1 個或更多字符,以避免與/ 衝突s/
(在「搜尋」中)。
旁白:
這會觸發 302(暫時)重定向到您的 404 錯誤文件(它掩蓋了 404 回應和實際觸發 404 的 URL)。這通常是不可取的,除非您有非常具體的要求。您通常應該在此處使用根相對 URL 路徑。例如:
ErrorDocument 404 /baba/404.php然後透過內部子請求提供
/baba/404.php
,並且錯誤文件本身不會暴露給最終使用者。
如果您使用「重定向」來解決缺少資源的問題,請參閱上述關於不在 HTML 原始碼中使用相對 URL 的內容。