網址示例:
1) mydomain.com/coding/mysql/
2) mydomain.com/coding/mysql/?contactId=333&UTM=aff
3) mydomain.com/coding/?contactId=333
這是我的 htaccess 檔案
RewriteEngine On
RewriteRule ^(. )/(. )/?$ index.php?book=$1&chapter=$2 [NC,L,QSA]
RewriteRule ^(. )/?$ index.php?book=$1 [NC,L,QSA]
所以我在 index.php 檔案上列印_r($_REQUEST) 看看我得到了什么:
1) Array ( [book] => coding [chapter] => mysql/ )
2) Array ( [book] => coding [chapter] => mysql/ [contactId] => 333 [UTM] => aff )
3) Array ( [book] => coding/ [contactId] => 333 [UTM] => aff )
我的問題是我不想在最后一個可用引數中顯示 / 如果我像這樣呼叫上面的示例,它不會添加 /:
1) mydomain.com/coding/mysql
2) mydomain.com/coding/mysql?contactId=333&UTM=aff
3) mydomain.com/coding?contactId=333
我需要改變我的規則才能mydomain.com/coding/mysql?contactId=333&UTM=aff導致Array ( [book] => coding [chapter] => mysql [contactId] => 333 [UTM] => aff )
謝謝!非常感激。我希望這是有道理的。
uj5u.com熱心網友回復:
RewriteRule ^(. )/(. )/?$ index.php?book=$1&chapter=$2 [NC,L,QSA] RewriteRule ^(. )/?$ index.php?book=$1 [NC,L,QSA]
默認情況下,正則運算式是貪婪的,因此在 的情況下(. )/?,捕獲組將使用后面的可選項 /。
您可以像這樣使量詞變得非貪婪(即懶惰):(. ?)/?或匹配“除斜線以外的任何東西”(即[^/] ),而不僅僅是“任何東西”(即. )。
例如:
RewriteRule ^index\.php - [L]
RewriteRule ^([^/] )/([^/] )/?$ index.php?book=$1&chapter=$2 [L,QSA]
RewriteRule ^([^/] )/?$ index.php?book=$1 [L,QSA]
更新:第一條規則只是為了防止重寫回圈,因為模式^([^/] )/?$也會匹配index.php(重寫的 URL 路徑)。
的NC,因為你是匹配的小寫和大寫標志在這里不需要一切反正。
但是,您應該與尾部斜杠保持一致,并包含尾部斜杠或省略它 - 您不應該真正允許兩者都提供相同的內容。這可能是一個“重復內容”問題(兩個 URL 提供相同的內容)。
如果您想同時允許301從一個重定向到另一個。
更新:
是的,所以
mydomain.com/library.php當我嘗試訪問它時,我找到了一個檔案,而不是實際檔案Array ( [book] => library.php )
(旁白:如果您只是匹配/強制尾隨斜杠 - 如評論中所述,那么這不一定是一個問題。)
這是因為上面的正則運算式相當通用。它匹配/<any-path-segment>。如果您的 URL(您要重寫的)不包含點,那么您可以簡單地在正則運算式中排除一個點,以避免匹配具有檔案擴展名(例如.php或.js等)的“檔案” 。
例如,將上面的正則運算式修改如下以排除點:
RewriteRule ^([^/.] )/([^/.] )/?$ index.php?book=$1&chapter=$2 [L,QSA]
RewriteRule ^([^/.] )/?$ index.php?book=$1 [L,QSA]
這將匹配foo,但不匹配foo.txt(因為它包含一個點)。
這也避免了需要匹配的第一個規則index.php,因為這自然會被更具體的正則運算式排除在外。
通常,您應該對正則運算式盡可能具體,并且只匹配需要的內容,以避免意外匹配太多。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/332875.html
