完全重定向空查询字符串

Redirect exactly null query string

我的网络服务器上有很多网站。

我只想在 url 正好是 /?

时重定向我的所有网站

例如:

但不像 www.example.com/x.php?www.example.com/ 或其他任何东西。

我尝试了很多但都失败了:

RewriteCond %{QUERY_STRING} ^$
RewriteRule ^ %{REQUEST_URI}?_test [L,R=302]

RewriteCond %{QUERY_STRING} ^\?$
RewriteRule  ^ http://www.example.com [L,R=301]

RewriteCond %{REQUEST_URI} =="/?"
RewriteRule ^(.*)$ http://www.example.com/ [L,R=301]

您可以使用以下代码来完成此操作。

RewriteEngine On
RewriteRule ^\?$ http://www.example.com/ [L,R=301]

您将规则定义为以 ?并以该符号结尾。

要重定向空查询字符串(即当 URL 仅以 ? 结尾时),您需要检查 THE_REQUEST.

RewriteRule 模式与 URL 路径匹配,这明显排除了查询字符串(包括 ?)。

REQUEST_URI server 变量也省略了查询字符串和任何尾随 ?。 (请注意,这与 PHP 中的 $_SERVER['REQUEST_URI'] 变量不同,后者 确实 包含完整请求 URL。)

并且 QUERY_STRING 变量为空,无论尾随 ? 是否存在。

因此,为了 删除 (即重定向)URL 末尾的尾随 ?,您可以执行类似以下:

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ (.+)\?\ HTTP/
RewriteRule ^ %1? [R,L]

RewriteRule 替换 (%1?) 末尾的尾随 ? 实际上并不存在于结果 URL 中,但为了 完全删除 查询字符串。或者,如果您使用的是 Apache 2.4+,则可以改用 QSD(查询字符串丢弃)标志:

RewriteRule ^ %1 [R,L,QSD]