如何在远程重定向后删除重写URL的查询部分



要么我太累了,看不到我做错了什么,要么我错过了一些重要的东西。

基本上,我有一组简单的重写规则,它们与中央调度文件(index.php)一起使用,分别处理HTML, CSS和JavaScript文件的请求,它们看起来像这样。

RewriteEngine on
RewriteRule (.+).html$ index.php?action=view&url=$1.html [L]
RewriteRule (.+).css$ index.php?action=resource&type=css&url=$1.css [L]
RewriteRule (.+).js$ index.php?action=resource&type=js&url=$1.js [L]

长话短说这些规则工作得很好,但是我已经被负责该网站的SEO机构通知,其中一个url存在错误,需要永久重定向(301)到正确的链接。因为只有一个URL需要重定向,所以我选择使用Redirect而不是URL重写,并添加了以下规则:

Redirect 301 /page1.html /page2.html

这也工作得很好,除了在远程重定向后为page1.html我得到查询部分(?action=view&url=page2.html)显示在浏览器地址栏中。我完全理解HTMl重写规则只是在URL完成后添加了查询字符串部分,但是在执行远程301重定向之后,我需要做些什么来摆脱查询部分呢?

只是添加我尝试了URL重写方法,但似乎无论我做什么,L标志都被简单地忽略,HTML重写规则仍然被执行。

RewriteRule ^page1.html$ page2.html [L,R=301]

这是一个重写重定向,应该切断查询字符串。把它放在其他3条规则之前,否则它将被忽略。

我不知道网络服务器和网络服务器版本的解决方案会有多大变化,但对我来说有效的是"当你想要擦除现有的查询字符串时,用一个问号结束替换字符串"。

参见http://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewriterule (Apache v2.4)中的"修改查询字符串"

RewriteRule ^page1.html$ page2.html? [L,R=3xx]

需要R标志来显示新的URI,而不是显示带有查询字符串的原始URI。但是,即使没有R标志,也不会传递查询字符串。

最新更新