htaccess 将所有带有问号参数的 URL 重定向到不带问号参数的 URL

htaccess 将所有带有问号参数的 URL 重定向到不带问号参数的 URL

为了解决我的问题,我检查了很多,有一些很接近,但没有一个能解决我的问题。

我需要永久重定向所有以此结尾的 URL:

?mode=list

?mode=grid

至无(删除问号及其后的内容)

例子:

example.com/random-url-here?mode=grid redirect to example.com/random-url-here

example.com/whatever-url-here?mode=list redirect to example.com/random-url-here

我尝试过这个:

RewriteEngine on 
RewriteRule (.*)$^mode=list $1
RewriteRule (.*)$^mode=grid $1

和这个

RewriteEngine on 
RewriteRule (.*)$^mode=list $1 [L,R=301]
RewriteRule (.*)$^mode=grid $1 [L,R=301]

但它不起作用。显然,我不明白这是如何工作的。请帮忙。

谢谢

答案1

example.com/random-url-here?mode=grid

?URL 中第一个(即本例中)后面的部分mode=grid称为请求参数

RewriteRule (.*)$^mode=list $1 [L,R=301]

RewriteRule指令最多接受 3 个参数:

RewriteRule pattern substitution [flags]

图案(第一个参数)该RewriteRule指令是一个正则表达式(regex),与请求的仅限 URL 路径,其中特别排除了查询字符串。因此您无法使用该RewriteRule指令匹配查询字符串。

要匹配查询字符串,您需要使用附加RewriteCond(条件)指令并根据QUERY_STRING服务器变量进行检查。RewriteCond指令适用状况执行RewriteRule下面的指令。

然而,正则表达式(.*)$^mode=list(除了尝试匹配查询字符串)将绝不在此上下文中匹配。$断言行尾并^断言行起始 - 所以这将始终失败。

在上面的例子中,$1反向引用(在替换字符串) 尝试匹配 URL 路径。但是,此 URL 路径(在目录上下文,即.htaccess)不是以斜线开头(即它是相对的),因此会导致格式错误的重定向,除非您还在文件RewriteBase的其他地方定义了指令.htaccess相对的替换字符串被视为相对于包含文件的目录的文件系统路径.htaccess

如果您在此上下文中省略R( redirect) 标志(如在第一个示例中一样),那么它将尝试在内部重写请求(而不是外部重定向),因此可见的 URL 不会改变。

请尝试在根文件顶部附近执行以下操作.htaccess

RewriteEngine On

RewriteCond %{QUERY_STRING} ^mode=(list|grid)$
RewriteRule (.*) /$1 [QSD,R=302,L]

以上说明...对于所有(.*)具有查询字符串mode=listmode=grid(精确)的 URL,则重定向到相同的 URL 路径并丢弃查询字符串(QSD- Query String Discard)。这QSD是 Apache 2.4 的新功能(我假设您正在使用)。如果您省略该QSD标志,那么您将得到一个重定向循环(因为查询字符串将重新附加到重定向的 URL)。

请注意,上面匹配查询字符串确切地(如您的示例所示)。如果查询字符串中有任何其他 URL 参数或大小写不同,则匹配失败。

请注意,这是一个 302(临时)重定向。只有当您确认它正常工作时,才可以将其更改为 301(永久)——如果这是意图的话。301 会被浏览器永久缓存,因此可能会使测试出现问题。

参考:

相关内容