有这么一段代码
<IfModule mod_rewrite.c>
RewriteCond %{QUERY_STRING} !^$
RewriteCond %{QUERY_STRING} !(^|&)srp=
RewriteCond %{QUERY_STRING} !(^|&)q=
RewriteRule ^(.+?)\.html$ https://%{HTTP_HOST}/$1.html? [L,R=301]
</IfModule>
<IfModule mod_rewrite.c>
RewriteRule ^(.+?)\.html(?!/amp/).+$ https://%{HTTP_HOST}/$1.html? [L,R=301]
</IfModule>
它工作得很好,但如果链接是这样的:
website.com/post.html?
在这种情况下,问号仍然存在。在这种情况下我该如何删除它?
您不能简单地检查空查询字符串,因为QUERY_STRING
服务器变量已定义且为空,无论尾随是否?
存在或不存在。
去除流浪者?
在 URL 路径的末尾(本质上是一个空查询字符串),您可以检查THE_REQUEST
服务器变量。例如:
RewriteCond %{THE_REQUEST} \s[^?]*\?\s
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [QSD,L,R=301]
The QSD
(查询字符串丢弃)标志删除查询字符串。这是在 Apache 2.4 上删除查询字符串的首选方法,而不是附加一个?
to the 代换 string.
THE_REQUEST
包含 HTTP 请求标头的第一行,并包含以下形式的字符串:
GET /post.html? HTTP/1.1
所以,正则表达式\s[^?]*\?\s
匹配文字?
随后是一个space在 URL 路径的末尾(避免?
这可能发生在非空查询字符串的末尾)。例如:
-
/post.html?
重定向到/post.html
-
/post.html?foo=1?
- 自决赛以来没有重定向?
是的一部分foo
网址参数value.
Aside:你不应该将每个块包围在<IfModule mod_rewrite.c>
包装器,除非指令是可选的。 (即使如此,这些指令也应该组合在一起。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)