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 On
RewriteCond %QUERY_STRING ^(.*)page=1(.*)$
RewriteRule (.*) $1?%1%2?
——没有测试它,但类似的东西应该可以工作。以上是关于mod_rewrite:从 URL 中删除查询字符串?的主要内容,如果未能解决你的问题,请参考以下文章
mod_rewrite:将路径和查询字符串 URL 作为参数传递
如何根据查询字符串在 apache mod_rewrite 中禁止 url?