2010-08-11 88 views
24

我想作以下重定向(301)使用的.htaccessmod_rewrite:从URL中删除查询字符串?

*?页= 1重定向到*

(其中*是通配符)。

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

有没有一种快速的方法来做到这一点?

+0

好问题:D – ncomputers 2017-05-26 04:30:40

回答

38

这应做到:通过线

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

线:

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

如果你想重定向是临时的(302),那么你可以删除=permanent部分。暂时移动是R标志的默认值。

+0

感谢您的回复!似乎无法得到那个工作,但是当我尝试访问../?page=1任何想法时似乎没有任何影响? – Freddy 2010-08-11 10:48:47

+0

检查您的服务器是否加载了mod_rewrite,并且您的服务器设置允许您在.htaccess文件中指定这些重写设置。 – 2010-08-11 11:00:24

+0

@Fabian - “RewriteRule”不匹配,因为每个目录('.htaccess')中测试模式的输入不包含前导斜杠。我怀疑这是这个问题。 – 2010-08-11 12:12:14

13

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

+8

QSD在Apache 2.4.0及更高版本中可用:http://httpd.apache.org/docs/trunk/rewrite/flags.html#flag_qsd – waraker 2014-04-01 20:44:05

3

对于剥离整个查询字符串,这将是不够的:

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

好的答案:D我相信它也可能是''RewriteRule^$ {REQUEST_URI}?'' – ncomputers 2017-05-26 04:34:07

6

如果你是在Apache 2.4,您可以简单地使用QSD(查询字符串丢弃标志),丢弃你的目标网址的具体查询字符串。

这里是Apache 2.4用户一个例子:

旧的URL: - /富/酒吧/页= 1

新网址: - /富/酒吧/

htaccess的代码:

RewriteEngine on 

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

的规则将上述任何URI重定向与?page = 1删除查询字符串。此示例将在Apache版本低于2.4时返回500错误,因为它们不支持QSD。

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

一个例子:

RewriteEngine on 

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

上面的例子作品几乎在Apache的所有版本。

(希望对您有所帮助!)