要么我太累了,不能看到我做错了什么,或者有什么重要我在这里失踪。
基本上我有一套简单的重写规则,它们与中央调度程序文件(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重写规则仍然执行。
答案 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标志,查询字符串也不会被传递。