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

时间:2011-07-15 22:02:35

标签: regex mod-rewrite

要么我太累了,不能看到我做错了什么,或者有什么重要我在这里失踪。

基本上我有一套简单的重写规则,它们与中央调度程序文件(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)到正确的链接。由于只有一个需要重定向的网址,我选择使用Redirect而不是网址重写,并添加了以下规则。

Redirect 301 /page1.html /page2.html

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

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

我不知道解决方案可能会因Web服务器和Web服务器版本而改变多少,但对我有用的是"当您想要删除现有的查询字符串时,请结束替换字符串只有一个问号"。

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

所以,

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

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