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

时间:2017-10-05 12:16:07

标签: .htaccess mod-rewrite

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

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

这是做什么的?

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

2 个答案:

答案 0 :(得分:4)

  

它将http://foo.bar.com抓取为http:foo.bar.com,然后将所有字符.替换为http:/foo.bar.com。绝对没有,对吧?

对,绝对不是。 :)

该代码减少了在单个斜杠的URL路径中出现的多个斜杠。因此,example.com/foo//bar////baz之类的网址会变为example.com/foo/bar/baz

REQUEST_URI服务器变量仅包含URL路径(以斜杠开头)。例如。 /foo//bar////baz(在上面的例子中)。 %1%2是对最后匹配的 CondPattern 中捕获的组的反向引用(即双斜杠的任意一侧的字符串)。

. 模式中的单个点(RewriteRule)与单个字符匹配。因此,当URL路径为空时,此规则会匹配除文档根目录之外的每个URL。

为什么要检查多个斜杠?如果这些是对物理文件的请求,那么Apache将隐式减少多个斜杠以便为资源提供服务。因此/foo//bar////baz.html将返回与/foo/bar/baz.html相同的内容。所以,这是“好”。但是,这些是技术上不同的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

答案 1 :(得分:3)

MrWhite has explained very nicely解释您所涉及的规则。但是,当带有多个斜杠的URL被发送到您的Web服务器时仍然存在问题,例如/foo//bar////baz。您的规则会在将其解析为/foo/bar/baz之前导致5次重定向。

在下面的评论部分中有一些讨论他的回答是关于在单个重定向中完成此操作的规则应该是什么。

以下规则会将所有多个斜杠网址删除为单个重定向中的单个斜杠网址:

RewriteEngine On

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

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