.htaccess HTACCESS和[PT]标志忽略传递url的一部分?

.htaccess HTACCESS和[PT]标志忽略传递url的一部分?,.htaccess,.htaccess,当我在以下地点测试我的规则时,我无法理解这一点: 它说它应该起作用 我正在使用此url: 然而,此时它终止于id,这就是输出: Array ( [id] => view [test2] => [keyword] => clients [test] => 1/view [country] => uk [lang] => en ) 我不明白为什么它会忽略1/而将id设置为视图?请记住,包括mod_alias和重写引擎的所有规则(一次又一次),根据您看到的输出

当我在以下地点测试我的规则时,我无法理解这一点:

它说它应该起作用

我正在使用此url:

然而,此时它终止于id,这就是输出:

Array ( [id] => view [test2] => [keyword] => clients [test] => 1/view [country] => uk [lang] => en )
我不明白为什么它会忽略1/而将id设置为视图?

请记住,包括mod_alias和重写引擎的所有规则(一次又一次),根据您看到的输出数组,这条规则可能需要调整:

#keyword
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+)/(.*)/$ /$2?keyword=$1&test=$2 [NC,QSA,PT]
^([^/]+)/(.*)/$
与“客户端/1/view/”匹配,第二个反向引用变为“1/view”,因此测试参数被分配给1/view,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=视图

我不确定这些参数值最终应该是什么,但是在上面的规则中,用RewriteCond检查“test”或“keyword”查询字符串参数可能会阻止该规则被应用两次?比如:

#keyword
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{QUERY_STRING} !keyword
RewriteRule ^([^/]+)/(.*)/$ /$2?keyword=$1&test=$2 [NC,QSA,PT]
请记住,根据您看到的输出数组,包括mod_alias和重写引擎的所有规则(一次又一次),这条规则可能需要调整:

#keyword
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+)/(.*)/$ /$2?keyword=$1&test=$2 [NC,QSA,PT]
^([^/]+)/(.*)/$
与“客户端/1/view/”匹配,第二个反向引用变为“1/view”,因此测试参数被分配给1/view,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=视图

我不确定这些参数值最终应该是什么,但是在上面的规则中,用RewriteCond检查“test”或“keyword”查询字符串参数可能会阻止该规则被应用两次?比如:

#keyword
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{QUERY_STRING} !keyword
RewriteRule ^([^/]+)/(.*)/$ /$2?keyword=$1&test=$2 [NC,QSA,PT]

非常感谢,我现在也完全理解了mod_重写的工作方式。我认为它只是将字符串传递到下一步。非常感谢这一点,我现在也完全理解了mod_重写的工作方式。我认为它只是将字符串传递到下一步。