Apache如何在忽略重寫規則的情況下找到404的原因

Apache如何在忽略重寫規則的情況下找到404的原因

所以我有這個

RewriteCond %{REQUEST_URI} (da-dk)/(.*)(/|\.php)$
RewriteRule ^(da-dk)/(.*)(/|\.php)$ /$2$3 [L]

但由於某些原因 example.com/da-dk/ 給出“404 - 未找到”

我想嘗試理解為什麼 apache 會得出這個結論 - 即它遇到並遵循什麼規則

答案1

假設這是在根.htaccess文件中...

RewriteRule ^(da-dk)/(.*)(/|\.php)$ /$2$3 [L]

請求/da-dk/(與 URL-path 匹配da-dk/)與正規表示式不匹配,^(da-dk)/(.*)(/|\.php)$因此不處理/遵循此規則。

因此,除非您有其他與此請求相符的規則遵循規則,因此出現了 404 (至於「遇到」什麼規則,那麼,您擁有的所有其他規則都是遭遇.)

順便說一下,前面的狀態(RewriteCond指令) 這裡完全是多餘的,應該刪除。它沒有做任何更多的事情RewriteRule 圖案已經成立了。

具體來說,此規則(正規表示式)將符合以下形式的 URL:

  • /da-dk/.php
  • /da-dk/<foo>/
  • /da-dk/<foo>.php
  • /da-dk/<foo>/<bar>/<baz>/
  • /da-dk/<foo>/<bar>/<baz>.php

它不匹配:

  • /da-dk/<foo>
  • /da-dk/

該規則只是刪除所/da-dk請求 URL 上的前綴(大概在希望重寫的 URL 與檔案系統目錄或檔案相符)。

如果/da-dk/需要重寫回根,則可以修改上述規則以允許這種情況(在此過程中,也可以稍微簡化)。例如,請嘗試以下操作:

RewriteRule ^da-dk/(.+(/|\.php))?$ /$1 [L]

這裡,URL-path後面的部分da-dk/就完成了選修的。 (在這種情況下,$1反向引用實際上是空的.)

透過將量詞從 更改*+這也可以避免匹配(無意義的) URL /da-dk/.php

無需捕獲da-dk部分(第一個路徑段),因為這沒有在代換字串(第二個參數)。

反向$1引用現在包含前綴後的整個 URL 路徑da-dk/。 (不需要$2$3原來一樣。)

相關內容