Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 当第一个参数只是一个点时,重写规则是如何工作的?_Regex_Apache_.htaccess_Mod Rewrite - Fatal编程技术网

Regex 当第一个参数只是一个点时,重写规则是如何工作的?

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:/

我安装了一些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\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
  • 对你所质疑的规则的解释。但是,如果将带有多个斜杠的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
    引擎获得多个无斜杠匹配。

    对所讨论规则的解释。但是,如果将带有多个斜杠的URL发送到web服务器,例如
    /foo//bar///baz
    ,则仍然存在问题。您的规则在解析为
    /foo/bar/baz
    之前将导致5次重定向

    在他的回答下面的评论部分有一些讨论,关于在一个重定向中实现这一点的规则应该是什么

    下面是一条规则,它将删除所有