mod_rewrite:从URL中删除查询字符串?

时间:2010-08-11 09:26:42

标签: apache .htaccess mod-rewrite redirect

我正在尝试使用.htaccess

进行以下重定向(301)
  

*?page = 1重定向到*

(其中*是通配符)。

基本上,我只想阻止任何人在网址末尾使用?page = 1访问某个网页,而是将其指向相同的网址减去?page=1

有快速的方法吗?

4 个答案:

答案 0 :(得分:41)

这应该这样做:

RewriteEngine    On
RewriteCond      %{QUERY_STRING}    ^page=1$
RewriteRule      (.*)               $1?     [R=permanent]

逐行:

  1. 您启用了重写功能。
  2. 您指定一个条件(“if statement”)查询字符串必须完全page=1才能应用以下规则。
  3. 然后指定一条规则,将整个路径(。*)替换为自身($ 1),但将查询字符串设为空(?),并使结果成为永久重定向(301)。
  4. 如果您希望重定向是临时的(302),那么您可以删除=permanent部分。暂时移动是R标志的默认值。

答案 1 :(得分:19)

你也可以使用QSD标志(查询字符串丢弃)重定向某个地方而不传递查询字符串。

答案 2 :(得分:8)

如果您使用的是Apache 2.4您可以使用QSD(查询字符串放弃标记)来丢弃目标网址中的特定查询字符串。

以下是Apache 2.4用户的示例:

旧网址: - / foo / bar /?page = 1

新网址 - / foo / bar /

Htaccess代码:

 RewriteEngine on

 RewriteCond %{THE_REQUEST} \?page=1\sHTTP [NC]
RewriteRule ^ %{REQUEST_URI} [L,R,QSD]

上述规则会重定向任何带有?page = 1 的uri,以删除查询字符串。此示例将在Apache版本下面返回500错误,因为它们不支持QSD。

在较低版本的Apache上,您可以在目标网址的末尾使用空白问号来移除查询字符串。

一个例子:

 RewriteEngine on

 RewriteCond %{THE_REQUEST} \?page=1\sHTTP [NC]
RewriteRule ^ %{REQUEST_URI}? [L,R]

上面的示例几乎适用于所有版本的apache。

(希望这会有所帮助!)

答案 3 :(得分:4)

对于剥离整个查询字符串,这就足够了:

RewriteRule ^(.*) http://domain.com/$1? [R=301,L]