.htaccess Apache重定向301在使用GET参数(如?blah=)时失败

vxqlmq5t  于 2022-11-16  发布在  Apache
关注(0)|答案(3)|浏览(141)

我已经为一个客户构建了一个新的PHP站点,并希望将排名靠前的Google结果从旧站点结构重定向到新站点。
我已经在documentroot的.htaccess中放置了几十个重定向301,虽然有些工作正常,但我对其他一些有问题。
这样做效果很好:

Redirect 301 /nl/flash/banner_new.swf http://www.example.com/actueel/nieuws.html?action=show&f_id=152

这不起作用!(导致一个404,因为重定向被简单地跳过):

Redirect 301 /nl/index.php?mID=24511&subID=0 http://www.example.com/solutions/printsolutions.html
Redirect 301 /nl/index.php?mID=24512&subID=0 http://www.example.com/support/koppeling-met-omgeving.html

.htaccess文件中混合了重定向,只有带有GET参数的重定向才会失败。
是否有解决方法?忽略失败的重定向对客户来说不是一个选项。感谢您的想法。

qzwqbdag

qzwqbdag1#

虽然秋葵汤的答案推理是正确的,但我无法让他的重写规则工作。
添加另一个RewriteCond就可以了。下面的代码已经过测试,工作正常。

RewriteCond %{REQUEST_URI} /nl/index.php$
RewriteCond %{QUERY_STRING} ^mID=24511&subID=0$
RewriteRule ^.*$ http://www.example.com/solutions/printsolutions.html [L,R=301]
rryofs0p

rryofs0p2#

同意秋葵浓汤和马丁的回答......但是:
Martijn的拼写错误,REQUEST_URI条件的正则表达式开头应为“^”:

RewriteCond %{REQUEST_URI} ^/nl/index.php$

我也只能让Martijn的,而不是秋葵汤的,在我的.htaccess文件所在的地方工作。
此外,如果不希望参数字符串随重写一起传递,则应在URL的末尾添加“?”:

RewriteRule ^.*$ http://www.example.com/solutions/printsolutions.html? [L,R=301]

否则,按照Martijn的代码,它会显示“如果您的URL是/nl/index.php?mID=24511&subID=0,则重定向到http://www.example.com/solutions/printsolutions.html?mID=24511&subID=0,重定向头为301 Permanent,并且不处理此URL上的更多规则”
这可能是也可能不是你想要的,公平地说,如果参数不被理解,它们将被忽略而不会造成任何伤害,所以这可能不会有什么影响。但是,如果你想将用户重定向到一个新的页面,并且想要“漂亮的URL”,那么去掉参数字符串是更好的选择,所以在目标URL的末尾粘贴“?”。

n3ipq98p

n3ipq98p3#

Redirect只对URL路径进行操作:
旧的 URL-path 是以斜杠开头的区分大小写(%-decoded)路径。[...]
因此,不会检查URL查询(第一个?之后到第一个#之后的部分)。
但是您可以使用mod_rewrite来执行此操作:

RewriteCond %{QUERY_STRING} ^mID=24511&subID=0$
RewriteRule ^nl/index\.php$ http://www.example.com/solutions/printsolutions.html [L,R=301]
RewriteCond %{QUERY_STRING} ^mID=24512&subID=0$
RewriteRule ^nl/index\.php$ http://www.example.com/support/koppeling-met-omgeving.html [L,R=301]

相关问题