为什么使用%{query_string}的htaccess重写只在URL包含index.php时才有效?

时间:2014-09-02 10:38:16

标签: .htaccess mod-rewrite

我有像这样的htaccess重定向:

RewriteCond %{QUERY_STRING} tabid=53
RewriteRule . http://www.example.com/foobar? [R=301,L]

因此,当我访问example.com/?tabid=53时没有任何反应,example.com/index.php?tabid=53被重定向到/foobar。当我添加另一个条件时:

RewriteCond %{REQUEST_URI} ^(.*)$

没有什么会改变,根据我的理解,这应该说"如果在uri"中是否有index.php并不重要。我做错了什么?

2 个答案:

答案 0 :(得分:2)

你试过这个:

RewriteCond %{QUERY_STRING} tabid=53
RewriteRule ^(.*)$ http://www.example.com/foobar? [R=301,L]

我认为你的单点问题是,点匹配任何单个字符,但你的example.com/?tabid=53没有匹配。如果您使用example.com/i?tabid=53,则可以使用。

答案 1 :(得分:2)

您可以通过匹配.*代替.来避免这种奇怪的行为 您还可以匹配root levelindex.php

两种解决方案都按预期工作。

解决方案1 ​​

RewriteEngine On

RewriteCond %{QUERY_STRING} tabid=53 [NC]
RewriteRule .* /foobar? [R=301,L]

解决方案2

RewriteEngine On

RewriteCond %{QUERY_STRING} tabid=53 [NC]
RewriteRule ^(|index\.php)$ /foobar? [R=301,L]

结论

您的规则存在问题

RewriteRule . http://www.example.com/foobar? [R=301,L]

是因为.表示one character并且从不匹配,因为它是空的(没有文件,直接在根级别查询字符串)。

.*匹配(表示0 or more characters)或RewriteRule ^(|index\.php)$(表示match root level -empty- or index.php

的原因