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

Fre*_*ddy 30 apache .htaccess mod-rewrite redirect

我正在尝试使用.htaccess进行以下重定向(301)

*?page = 1重定向到*

(其中*是通配符).

基本上,我只是想阻止任何人访问URL末尾的页面= 1的页面,而是将它们指向相同的网址减去?page=1.

有这么快的方法吗?

Fab*_*olm 43

这应该这样做:

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

逐行:

  1. 您打开重写功能.
  2. 您指定查询字符串必须完全page=1符合以下要应用的规则作为条件("if语句").
  3. 然后指定一个规则,用自身($ 1)替换整个路径(.*),但将查询字符串设为空(?),并使结果成为永久重定向(301).

如果您希望重定向是临时的(302),那么您可以删除该=permanent部件.暂时移动是R标志的默认值.


Did*_*olo 22

您还可以使用QSD标志(查询字符串丢弃)重定向某处而不传递查询字符串.

  • QSD在Apache 2.4.0及更高版本中可用:http://httpd.apache.org/docs/trunk/rewrite/flags.html#flag_qsd (9认同)

sta*_*een 9

如果您使用的是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]
Run Code Online (Sandbox Code Playgroud)

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

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

一个例子 :

 RewriteEngine on

 RewriteCond %{THE_REQUEST} \?page=1\sHTTP [NC]
RewriteRule ^ %{REQUEST_URI}? [L,R]
Run Code Online (Sandbox Code Playgroud)

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

(希望这可以帮助!)


Krz*_*oda 5

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

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