Regex 当第一个参数只是一个点时,重写规则是如何工作的?
我安装了一些PHP软件,在.htaccess中添加了以下内容:Regex 当第一个参数只是一个点时,重写规则是如何工作的?,regex,apache,.htaccess,mod-rewrite,Regex,Apache,.htaccess,Mod Rewrite,我安装了一些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:/
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\u URI
server变量仅包含URL路径(以斜杠开头)。例如,/foo//bar///baz
(在上面的示例中)%1
和%2
是对最后一个匹配CondPattern中捕获的组的反向引用(即双斜杠两侧的字符串)
重写规则
模式中的单点(
)与单个字符匹配。因此,当URL路径为空时,此规则匹配除文档根以外的所有URL
为什么要检查多个斜杠?如果这些是对物理文件的请求,那么Apache将隐式减少多个斜杠,以便为资源提供服务。因此/foo///bar///baz.html
将返回与/foo/bar/baz.html
相同的结果。所以,这就是“好”。然而,这些URL在技术上是不同的,因此搜索引擎可能会将其视为重复内容。如果您出于其他目的解析URL,它还可能破坏您的应用程序。这可能是问题,也可能不是问题。这将要求用户错误地链接到您,等等(除非您的web应用程序中出现导致生成这些URL的故障)
我想补充一点,这种方法不是特别有效,因为如果您有许多附加的斜杠,它需要多个外部重定向(尽管您可能会争辩说,这只是为了缓存边缘情况)。例如,给定对
/foo//bar///baz
的请求,将发生以下重定向:
/foo///bar///baz
(初始请求/重定向)/foo//bar///baz
(重定向)/foo//bar//baz
(重定向)/foo//bar/baz
(重定向)/foo/bar/baz
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\u URI
server变量仅包含URL路径(以斜杠开头)。例如,/foo//bar///baz
(在上面的示例中)%1
和%2
是对最后一个匹配CondPattern中捕获的组的反向引用(即双斜杠两侧的字符串)
重写规则
模式中的单点(
)与单个字符匹配。因此,当URL路径为空时,此规则匹配除文档根以外的所有URL
为什么要检查多个斜杠?如果这些是对物理文件的请求,那么Apache将隐式减少多个斜杠,以便为资源提供服务。因此/foo///bar///baz.html
将返回与/foo/bar/baz.html
相同的结果。所以,这就是“好”。然而,这些URL在技术上是不同的,因此搜索引擎可能会将其视为重复内容。如果您出于其他目的解析URL,它还可能破坏您的应用程序。这可能是问题,也可能不是问题。这将要求用户错误地链接到您,等等(除非您的web应用程序中出现导致生成这些URL的故障)
我想补充一点,这种方法不是特别有效,因为如果您有许多附加的斜杠,它需要多个外部重定向(尽管您可能会争辩说,这只是为了缓存边缘情况)。例如,给定对
/foo//bar///baz
的请求,将发生以下重定向:
/foo///bar///baz
(初始请求/重定向)/foo//bar///baz
(重定向)/foo//bar//baz
(重定向)/foo//bar/baz
(重定向)/foo/bar/baz
/foo//bar///baz
,则仍然存在问题。您的规则在解析为/foo/bar/baz
之前将导致5次重定向
在他的回答下面的评论部分有一些讨论,关于在一个重定向中实现这一点的规则应该是什么
以下规则将在单个重定向中将所有多个斜杠URL删除为单个斜杠URL:
RewriteEngine On
RewriteCond %{REQUEST_URI} //
RewriteRule ^.*$ /$0 [R=301,L,NE]
它使用RewriteRule
指令中匹配模式的反向引用,该指令已通过mod_rewrite
引擎获得多个无斜杠匹配。对所讨论规则的解释。但是,如果将带有多个斜杠的URL发送到web服务器,例如/foo//bar///baz
,则仍然存在问题。您的规则在解析为/foo/bar/baz
之前将导致5次重定向
在他的回答下面的评论部分有一些讨论,关于在一个重定向中实现这一点的规则应该是什么
下面是一条规则,它将删除所有