HTACCESS和[PT]标志忽略了通过url的部分?

时间:2012-03-23 17:22:35

标签: .htaccess

在我测试我的规则时,我无法弄明白:

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设置为视图?

1 个答案:

答案 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]