我的 .htaccess 檔案中有以下 2 條重寫規則:
# Rule 1
RewriteRule ^(AL|AK|AZ|AR|CA|CO)/?([a-zA-Z-] )?/?(faq|tagged)?/?([a-zA-Z0-9-] )?$ /pages/seo.select-page.php?state=$1&location=$2&page=$3&title=$4 [NC,L]
# Rule 2
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/.] )/?$ /pages/seo.$1.php [L]
總的來說,它作業正常,直到我的第二條規則需要指向一個以與 rule1 相同的字母開頭的頁面。
例如:
mydomain.co/copyright
在這種情況下,它默認為:
mydomain.co/CO
我試過添加字符數,但似乎沒有用。
(AL|AK|AZ|AR|CA|CO){2}
我怎樣才能解決這個問題?
uj5u.com熱心網友回復:
RewriteRule ^(AL|AK|AZ|AR|CA|CO)/?([a-zA-Z-] )?/?(faq|tagged)?/?([a-zA-Z0-9-] )?$ /pages/seo.select-page.php?state=$1&location=$2&page=$3&title=$4 [NC,L]
為了避免與您的示例 URL ( example.com/copyright)沖突,您可以簡單地洗掉NC第一條規則上的標志,使其成為區分大小寫的匹配 - 特別是前兩個大寫字符。第二和第三個路徑段(“位置”和“標題”)已經匹配a-z并且A-Z(因此已經不區分大小寫)。因此,只有在faq或tagged可以請求為除全小寫之外的任何其他內容時,這才是一個問題。
但是,此規則過于通用,因為它允許以任何順序省略任何后續路徑段,包括斜杠(路徑分隔符)*1,這將導致無效的重寫(如您的示例中所示)。
( *1它是允許/copyright成功匹配的可選分隔符。)
要允許第 2、第 3 和第 4 個路徑段是可選的,但僅按此順序并重要的是強制執行斜杠分隔符,您可以調整正則運算式以包含一系列嵌套的非捕獲子組:
RewriteRule ^(AL|AK|AZ|AR|CA|CO)(?:/([a-zA-Z-] )(?:/(faq|tagged)(?:/([a-zA-Z0-9-] ))?)?)?$ /pages/seo.select-page.php?state=$1&location=$2&page=$3&title=$4 [L]
這現在只允許形式為/stateor/state/location或/state/location/pageor的 URL /state/location/page/title。(除了“位置”和“標題”的正則運算式非常相似 - 所以這些可能會被顛倒。并且“位置”正則運算式也會匹配faq和tagged。)
這也將避免與/copyright帶有或不帶有NC標志的 URL 發生沖突,因為如果存在“位置”,則 2 個字符“狀態”代碼后的斜線分隔符是強制性的。
但是,正如所寫,此修改后的規則不允許以斜杠結尾的 URL,而您之前的規則允許這樣做。
在旁邊:
我試過添加字符數,但似乎沒有用。
(AL|AK|AZ|AR|CA|CO){2}
這不是“字符數”。{2}是一個數字量詞,與前面的模式完全匹配兩次。因此,在這種情況下,它實際上匹配 4 個大寫字符。它相當于:
(AL|AK|AZ|AR|CA|CO)(?:AL|AK|AZ|AR|CA|CO)
(只有第一組正在捕獲。)
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/408362.html
標籤:
