为了解决我的问题,我检查了很多,有一些很接近,但没有一个能解决我的问题。
我需要永久重定向所有以此结尾的 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=list
或mode=grid
(精确)的 URL,则重定向到相同的 URL 路径并丢弃查询字符串(QSD
- Query String Discard)。这QSD
是 Apache 2.4 的新功能(我假设您正在使用)。如果您省略该QSD
标志,那么您将得到一个重定向循环(因为查询字符串将重新附加到重定向的 URL)。
请注意,上面匹配查询字符串确切地(如您的示例所示)。如果查询字符串中有任何其他 URL 参数或大小写不同,则匹配失败。
请注意,这是一个 302(临时)重定向。只有当您确认它正常工作时,才可以将其更改为 301(永久)——如果这是意图的话。301 会被浏览器永久缓存,因此可能会使测试出现问题。
参考: