评论这里我们重写原始请求将自己与一个空的查询字符串,如果查询字符串是不是空的。
RewriteEngine On
RewriteCond %{QUERY_STRING} !^$
RewriteRule ^(.*)$ $1?
这已经包括了Apache,虽然与[QSD] Query String Discard
:
RewriteRule ^(.*)$ $1 [QSD]
注:查询字符串允许你跟踪各种各样的东西在日志文件中,并从外部来源的链接。这样做会限制这些选项。
这可能不是你想要做的(通过这种方式失去了很多旧的链接)。所以,以下是如何将旧的查询字符串重定向到新的URL作为301重定向。这对于那些不熟悉RegEx或者Apache工作方式的人来说会有点混淆。在字符串的第一部分以问号结束意味着“也许是前面的字符”。在这种情况下,我们在替换结束时添加了?
(不是REGEX模式),因为根据Apache manual for the QSD flag,Apache的默认行为类似于[QSA]
(查询字符串附加)。因此,单独添加单个?
正在创建一个空查询字符串以使现有字符串无效。在StackOverflow上有几个使用这种方法的答案。
RewriteCond %{QUERY_STRING} page=(.*)
RewriteRule .* %1/? [R=301,L]
使用[QSD]
你可以这样写:
RewriteCond %{QUERY_STRING} page=(.*)
RewriteRule .* %1/ [R=301,L,QSD]
你的另一场比赛中需要像contact.php
文件并将其重定向到/contact/
。这也可能仍然有效。
RewriteCond %{REQUEST_URI} !^/index.php$
RewriteRule ^(.+)\.php$ /$1/? [R=301,L]
这条规则也与QSD写成:
RewriteRule ^(.+)\.php$ /$1/ [R=301,L,QSD]
QSA代表查询字符串追加... – Clive
URL的查询字符串部分不能被改写,它会被添加到无论你做什么,重写的URL的新查询字符串。 URL重写意味着反过来工作。 – Alasdair
@Alasdair:这只是部分真实的,如果你在'?'中进行重写,它应该删除查询字符串。有关详细信息,请参阅此博客文章:http://www.simonecarletti.com/blog/2009/01/apache-rewriterule-and-query-string/ – Wolph