我有像这样的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并不重要。我做错了什么?
答案 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 level
或index.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
)