儘管 L 標誌,Apache mod_rewrite RewriteRule 仍然循環

儘管 L 標誌,Apache mod_rewrite RewriteRule 仍然循環

阿帕奇/2.4.54。
我試圖實現類似的URL(例如“/anystuff.htm”)在外部重定向到“/something”,其內部是“something.html”。但是以下規則會導致循環而不是停止,即“某物”被匹配

RewriteEngine On
RewriteBase /
RewriteRule ^something$ something.html [L]
RewriteRule ^(some|thing|any|stuff).*/?$ /something [L, R=301,NC]

但似乎「L」指令沒有效果,因為第二條規則再次匹配到「/something」的重定向,導致循環。

測試用https://htaccess.madewithlove.com/建議它應該按預期工作。我認為我無法啟用日誌記錄:-(

答案1

L標誌僅停止目前透過重寫引擎的傳遞,它不會停止全部加工。接下來的指令不會立即處理,但(在目錄上下文中)重寫過程會重新開始...在“第二遍”期間,第一個規則不再匹配(因為輸入現在是something.html),但第二個規則匹配,所以觸發重定向。

(重寫引擎有效地“循環”,直到 URL 不改變地通過。這些指令正在用於伺服器(非目錄)上下文,其中該L標誌確實有效地停止了所有處理,因為重寫引擎只有一次傳遞。

但是,在 Apache 2.4 上END,您可以使用該標誌來停止重寫引擎的所有處理(在目錄情境).例如:

RewriteEngine On

RewriteRule ^something$ something.html [END]
RewriteRule ^(some|thing|any|stuff) /something [R=301,NC,L]

(請注意,您有一個錯誤的空間在第二條規則的 flags 參數中。這會導致解析錯誤,所以我認為這是您問題中的拼寫錯誤?

第二條規則的尾隨正規表示式(即.*/?$)是多餘的。

L與重定向(標誌)一起使用R與 相同END。所有處理停止。

RewriteBase指令在您的範例中是多餘的。

注意:您應該先使用 302(臨時)重定向進行測試,只有在確認其按預期工作後才更改為 301(永久)。 301 由瀏覽器持久緩存,因此可能會為測試帶來問題。因此,您需要在測試之前清除瀏覽器(以及任何中間)快取。

測試https://htaccess.madewithlove.com/表明它應該按預期工作。

與真實伺服器不同,MWL 測試器僅(有效)透過規則進行“單次通過”,因此無法偵測重寫/重定向循環。


在旁邊:通常,您應該在內部重寫之前安排外部重定向指令。然而,你的第二條規則例子將重定向/something到自身,因此您的兩個指令目前取決於您的順序。

相關內容