我安装了一些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
的请求,将发生以下重定向:
/foo//bar////baz
(初始请求/重定向)/foo//bar///baz
(重定向)/foo//bar//baz
(重定向)/foo//bar/baz
(重定向)/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
引擎获得了多斜杠无匹配。