
所以我有這個
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
原來一樣。)