当第一个参数只是一个点时,RewriteRule是如何工作的



我安装了一些PHP软件,在.htaccess:中添加了以下内容

RewriteCond %{REQUEST_URI} ^(.*)//(.*)$
RewriteRule . %1/%2 [R=301,L]

这是在干什么?

我的解释显然是错误的:它将http://foo.bar.com捕获为http:foo.bar.com,然后用http:/foo.bar.com替换任何字符.。绝对不是,对吧?

它将http://foo.bar.com捕获为http:foo.bar.com,然后用http:/foo.bar.com替换任何字符.。绝对不是,对吧?

对,绝对不是。:)

该代码将URL路径中同时出现的多个斜杠减少为一个斜杠。所以像example.com/foo//bar////baz这样的URL变成了example.com/foo/bar/baz

REQUEST_URI服务器变量仅包含URL路径(以斜线开头)。例如CCD_ 14(在上面的例子中)。%1%2是最后匹配的CondPattern(即双斜线两侧的字符串)中捕获组的反向引用。

RewriteRule图案中的单点(.)与单个字符匹配。因此,当URL路径为空时,该规则匹配除文档根之外的所有URL。

为什么要检查多个斜杠如果这些是对物理文件的请求,那么Apache将隐式减少多个斜杠以服务于资源。因此/foo//bar////baz.html将返回与/foo/bar/baz.html相同的结果。所以,这很"好"。然而,这些URL在技术上是不同的,因此搜索引擎可能会将其视为重复内容。如果您出于其他目的解析URL,它也可能破坏您的应用程序。这可能是问题,也可能不是问题。这将要求用户错误地链接到你等等(除非你的网络应用程序中出现了导致生成这些URL的问题。)


我想补充一点,这种方法不是特别有效,因为如果你有很多额外的斜杠,它需要多个外部重定向(尽管你可能会说这只是为了缓存边缘情况)。例如,给定对/foo//bar////baz的请求,将发生以下重定向:

  1. /foo//bar////baz(初始请求/重定向)
  2. /foo//bar///baz(重定向)
  3. /foo//bar//baz(重定向)
  4. /foo//bar/baz(重定向)
  5. /foo/bar/baz

MrWhite已经很好地解释了您所讨论的规则的解释。然而,当带有多个斜杠的URL被发送到您的web服务器(例如/foo//bar////baz)时,仍然存在问题。在将规则解析为/foo/bar/baz之前,您的规则将导致5次重定向。

在他的回答下面的评论部分有一些讨论,关于在一次重定向中完成这项工作的规则应该是什么。

以下是一条规则,它将在单个重定向中将所有多个斜杠URL删除为单个斜杠URL:

RewriteEngine On
RewriteCond %{REQUEST_URI} //
RewriteRule ^.*$ /$0 [R=301,L,NE]

它使用了来自RewriteRule指令的匹配模式的反向引用,该指令已经通过mod_rewrite引擎获得了多斜杠无匹配。

最新更新