Apache 重定向无法与htaccess中的mod_rewrite一起使用

Apache 重定向无法与htaccess中的mod_rewrite一起使用,apache,.htaccess,mod-rewrite,redirect,Apache,.htaccess,Mod Rewrite,Redirect,我需要重定向几个具有查询字符串的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}

我需要重定向几个具有查询字符串的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。我做错了什么?

根据您的示例,您将被重定向到

http://some.site/spam/egg/?pageId=123456
http://another.site/spaming/egging/?pageId=45678
您可以使用浏览器开发人员工具查看重定向(在“网络”选项卡中)

可能重定向URL中的查询字符串导致404?您可以在重定向的末尾添加一个
,以清除查询字符串:

RewriteCond %{REQUEST_URI} ^/pages/foo.bar$
RewriteCond %{QUERY_STRING} ^pageId=45678$
RewriteRule ^.*$ http://another.site/spaming/egging/? [R=301,L]

您需要移动这两条规则,即在行上的
重写引擎下方的所有其他规则之前,因为其他规则可能会覆盖这两条规则

(根据您的评论)您的罪魁祸首规则是:

RewriteRule . index.php [L]
这实际上是将每个请求重写为
index.php
,并将
request\u URI
变量的值更改为
/index.php
,从而导致此条件失败:

RewriteCond %{REQUEST_URI} ^/pages/foo.bar$

@anubhava是的..我有很多Apache内部的“重定向301源目标”顶部的模式。@anubhava请注意,这些规则工作正常。@anubhava在顶部还有一个
RewriteEngine
代码段。。所有这些都工作正常。。只有查询没有重定向。。正如我所说,将这两条规则移到
RewriteEngine
行的所有其他规则之前。@anubhava非常感谢您很多…它的工作…这个块是罪魁祸首
RewriteCond%{REQUEST\u FILENAME}-f[或]RewriteCond%{REQUEST\u FILENAME}-d RewriteRule^-[L]RewriteRule。index.php[L]
…您能解释一下吗?另外,请添加一个答案,以便我可以接受。。