重定向不适用于htaccess中的mod_rewrite

时间:2015-12-21 14:56:49

标签: apache .htaccess mod-rewrite redirect

我需要重定向几个具有查询字符串的URI,如:

/pages/foo.bar?pageId=123456http://some.site/spam/egg/

/pages/foo.bar?pageId=45678http://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.我做错了什么?

2 个答案:

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