【问题标题】:Why does RewriteRule ^page/?$ page.php [L] match site.com/page//为什么 RewriteRule ^page/?$ page.php [L] 匹配 site.com/page//
【发布时间】:2010-10-03 08:25:33
【问题描述】:
RewriteEngine on
RewriteRule ^page/?$ page.php [L]

这最终匹配 url www.site.com/page// 但在内部它的行为与 www.site.com/page/ 不同,因为样式表和图像不再正确显示。是我做错了什么,还是如果我不想遇到很多麻烦,这只是我需要处理的事情?

在我看来,它应该只匹配 www.site.com/page 或 www.site.com/page/

【问题讨论】:

    标签: apache .htaccess mod-rewrite


    【解决方案1】:

    Apache 去除空路径段。所以/path// 被视为/path/。但是您的浏览器并没有使用/path// 解析相对 URL。

    如果要删除多个斜线,可以使用以下规则:

    RewriteCond %{THE_REQUEST} ^[A-Z]+\ /(([^/\ ]+/)*)/+([^\ ]*)
    RewriteRule ^ /%1%3 [L,R=301]
    

    说明

    尽管 Apache 删除了内部的空路径段,但 THE_REQUEST 环境变量(包含 HTTP request line)保持不变。所以我们可以使用这个值来检查多个斜线。

    • ^[A-Z]+\ / 匹配请求方法、后面的空格和 URI 路径的第一个斜杠字符。
    • (([^/\ ]+/)*) 匹配所有以下非空路径段(foo/foo/bar/foo/bar/baz/ 等)或不匹配(如果没有)。
    • /+ 匹配空路径段,因为此斜杠之前的字符始终是另一个斜杠(参见前面的表达式)。
    • ([^\ ]*) 匹配 URI 的其余部分(可能包含更多空路径段)。

    示例:假设我们请求http://example.com/foo/bar//baz,请求行将如下所示:

    GET /foo/bar//baz HTTP/1.1
    

    然后该模式将匹配如下:

    0: GET /foo/bar//baz
    1: foo/bar/
    2: bar/
    3: baz
    

    因此,请求的路径 /foo/bar//baz 将被重定向到 /foo/bar/baz (/%1%3)。

    【讨论】:

    • 太棒了。你能解释一下每一行的作用吗?
    猜你喜欢
    • 2015-12-22
    • 2016-06-29
    • 1970-01-01
    • 2019-07-29
    • 1970-01-01
    • 2014-10-03
    • 2018-04-01
    • 1970-01-01
    • 2011-01-07
    相关资源
    最近更新 更多