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

Posted

技术标签:

【中文标题】mod_rewrite:从 URL 中删除查询字符串?【英文标题】:mod_rewrite: remove query string from URL? 【发布时间】:2011-03-28 06:53:40 【问题描述】:

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

*?page=1 重定向到 *

(其中 * 是通配符)。

基本上,我只是想阻止任何人访问 URL 末尾带有 ?page=1 的页面,而是将他们定向到相同的 URL 减去 ?page=1

有没有快速的方法?

【问题讨论】:

【参考方案1】:

如果您使用的是 Apache 2.4,您可以简单地使用 QSD(查询字符串丢弃标志)来丢弃目标 url 中的特定查询字符串。

这是 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 以删除查询字符串。此示例将在 2.4 以下的 Apache 版本上返回 500 错误,因为它们不支持 QSD。

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

一个例子:

 RewriteEngine on

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

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

(希望对您有所帮助!)

【讨论】:

【参考方案2】:

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

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

【讨论】:

好答案:我相信也可能是RewriteRule ^ $REQUEST_URI? 为什么我们需要 http//domain.com/ ?【参考方案3】:

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

【讨论】:

QSD 在 Apache 2.4.0 及更高版本中可用:httpd.apache.org/docs/trunk/rewrite/flags.html#flag_qsd【参考方案4】:

应该这样做:

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

一行一行:

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

如果您希望重定向是临时的 (302),那么您可以删除 =permanent 部分。临时移动是R 标志的默认设置。

【讨论】:

感谢您的回复!似乎无法使其正常工作,但是当我尝试访问 ../?page=1 任何想法时,它似乎没有任何效果? 检查您的服务器是否加载了 mod_rewrite,并且您的服务器设置允许您在 .htaccess 文件中指定这些重写设置。 @F*** - RewriteRule 不匹配,因为每个目录 (.htaccess) 上下文中的测试模式的输入不包含前导斜杠。我怀疑这就是这里的问题。 如果存在其他查询并且您要删除的唯一查询是page=1,该怎么办?例如:www.domain.com?a=5&page=1&b=2 变为 www.domain.com?a=5&b=2? 保留所有查询,除了 page=1 被剥离。 @enchance 这是一个不同的问题,您可能想为此打开一个新问题。但是这里有:RewriteEngine OnRewriteCond %QUERY_STRING ^(.*)page=1(.*)$RewriteRule (.*) $1?%1%2?——没有测试它,但类似的东西应该可以工作。

以上是关于mod_rewrite:从 URL 中删除查询字符串?的主要内容,如果未能解决你的问题,请参考以下文章

mod_rewrite:将路径和查询字符串 URL 作为参数传递

使用 mod_rewrite 从 url 中删除页面 id

如何根据查询字符串在 apache mod_rewrite 中禁止 url?

从虚拟主机的 URL 中删除 Tomcat 上下文(mod_jk、mod_rewrite)

Mod_rewriting 将查询字符串写入 swf 文件

mod_rewrite 匹配编码的 URL