为什么RewriteRule ^ page /?$ page.php [L]匹配site.com/page//

时间:2009-01-24 18:29:49

标签: apache .htaccess mod-rewrite

RewriteEngine on
RewriteRule ^page/?$ page.php [L]

最终匹配网址www.site.com/page//但内部的行为与www.site.com/page/不同,因为样式表和图片不再正常显示。我做错了什么,或者这只是我需要处理的事情,如果我不想经历很多麻烦?

对我而言,它似乎只能与www.site.com/page或www.site.com/page /

相匹配

1 个答案:

答案 0 :(得分:4)

Apache剥离空路径段。因此/path//被视为/path/。但是,您的浏览器不会使用/path//来解析相对网址。

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

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)。