【问题标题】: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)。