我需要重定向几个具有查询字符串的URI,如:
/pages/foo.bar?pageId=123456
至http://some.site/spam/egg/
/pages/foo.bar?pageId=45678
至http://another.site/spaming/egging/
我的htaccess中有这个:
RewriteEngine On
RewriteCond %{REQUEST_URI} ^/pages/foo.bar$
RewriteCond %{QUERY_STRING} ^pageId=123456$
RewriteRule ^.*$ http://some.site/spam/egg/ [R=301,L]
RewriteCond %{REQUEST_URI} ^/pages/foo.bar$
RewriteCond %{QUERY_STRING} ^pageId=45678$
RewriteRule ^.*$ http://another.site/spaming/egging/ [R=301,L]
但它不起作用,显示404.我做错了什么?
答案 0 :(得分:1)
从您的示例中,您将被重定向到
http://some.site/spam/egg/?pageId=123456
http://another.site/spaming/egging/?pageId=45678
您可以使用浏览器开发人员工具查看重定向(在“网络”标签中)。
也许重定向网址中的查询字符串会导致404?您可以在重定向结束时添加?
以清除查询字符串:
RewriteCond %{REQUEST_URI} ^/pages/foo.bar$
RewriteCond %{QUERY_STRING} ^pageId=45678$
RewriteRule ^.*$ http://another.site/spaming/egging/? [R=301,L]
答案 1 :(得分:1)
您需要移动这两个规则,即在RewriteEngine On
行之下的所有其他规则之前,因为其他规则可能会覆盖此规则。
(根据您的评论)您的罪魁祸首是这条规则:
RewriteRule . index.php [L]
实际上,每个请求都会重写为index.php
并将REQUEST_URI
变量的值更改为/index.php
,从而导致此条件失败:
RewriteCond %{REQUEST_URI} ^/pages/foo.bar$