在我测试我的规则时,我无法弄明白:
http://htaccess.madewithlove.be/
它声明应该有效。
我正在使用此网址:
http://site.com/uk/en/clients/1/view
Options +FollowSymlinks
RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !(\.[^./]+)$
RewriteRule ^(.+[^/](?!\.php))$ $1/ [QSA,PT]
#language
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{QUERY_STRING} !lang
RewriteRule ^([a-z]{2})/([a-z]{2})(?:/(.*)|)$ /$1/$3?lang=$2 [NC,QSA,PT]
#country
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{QUERY_STRING} !country
RewriteRule ^([a-z]{2})(?:/(.*)|)$ /$2?country=$1 [NC,QSA,PT]
#keyword
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+)/(.*)/$ /$2?keyword=$1&test=$2 [NC,QSA,PT]
#without actions
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php !-f
RewriteCond %{QUERY_STRING} !keyword
RewriteRule ^([^/]+)/(.*)$ /$2?keyword=$1 [NC,QSA,PT]
#id
RewriteCond %{QUERY_STRING} !id
RewriteRule ^([^/]+)/(.*)$ /$2?id=$1&test2=$2 [NC,QSA,PT]
#actions
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php !-f
RewriteCond %{QUERY_STRING} !action
RewriteRule ^/(.*)$ /?action=$1 [NC,QSA,PT]
RewriteCond %{REQUEST_URI} !(\.[^./]+)$
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule /$ /index.php [NC,QSA,L]
目前它终止于id,这就是输出:
Array ( [id] => view [test2] => [keyword] => clients [test] => 1/view [country] => uk [lang] => en )
我无法弄清楚为什么忽略1 /并将id设置为视图?
答案 0 :(得分:0)
请记住The [PT] flag passes the URI back through the entire URL mapping mechanism包括mod_alias并通过重写引擎的所有规则(一次又一次),根据您看到的输出数组,看起来这个规则可能是需要什么的调整:
#keyword
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+)/(.*)/$ /$2?keyword=$1&test=$2 [NC,QSA,PT]
^([^/]+)/(.*)/$
与“ clients / 1 / view / ”匹配,第二个反向引用变为“ 1 / view ”,因此测试参数被分配到1 /查看,URI变为/1/view
。
第二次匹配的URI是1/view
,因此此规则的结果是/view/?keyword=1&test=view&keyword=clients&test=1/view&country=uk&lang=en
(因为QSA)。
因此,“测试”和“关键字”会匹配两次,因为没有条件可以阻止这种情况。所以再次围绕所有重写规则,我们最终进入 id 部分,到那时,URI为view/
,匹配^([^/]+)/(.*)$
并且第一个反向引用匹配($ 1)是“查看”,第二个($ 2)是空白的,因为(.*)
没有匹配。因此id = view。
我不确定这些参数值实际上应该是什么结果,但可能会针对“测试”或“关键字”检查RewriteCond上述规则中的查询字符串参数会阻止该规则被应用两次?像:
#keyword
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{QUERY_STRING} !keyword
RewriteRule ^([^/]+)/(.*)/$ /$2?keyword=$1&test=$2 [NC,QSA,PT]