Apache重写规则,可以使用或不使用尾部斜杠

时间:2010-10-01 21:55:33

标签: regex url rewrite

我正在尝试重定向一系列静态网址,无论是否存在尾部斜杠,我希望它能正常工作:

/foo/bar  --->  /tacos
/foo/bar/  -->  /tacos

我尝试过以下各种各样的变体,但我总是只得到一个匹配的斜杠:

RewriteRule ^foo/bar?/$ http://url.com/tacos
RewriteRule ^foo/bar(?/)$ http://url.com/tacos
RewriteRule ^foo/bar*/$ http://url.com/tacos
RewriteRule ^foo/bar(*/)$ http://url.com/tacos

我觉得我错过了一些明显的东西。帮助

4 个答案:

答案 0 :(得分:34)

除了EBNFABNF之外,正则表达式中的量词指的是前面的表达式而不是下面的表达式。

所以:

RewriteRule ^foo/bar/?$ http://url.com/tacos

答案 1 :(得分:13)

如果你想匹配foo / bar,无论它是否跟着路径的另一部分,你可以说:

RewriteRule ^foo/bar(/.*|$) http://url.com/tacos

这将符合以下任何一项:

foo/bar
foo/bar/
foo/bar/baz

表示:匹配a)斜杠后跟0或更多字符,或b)字符串结尾。

另一方面,这些可能是不受欢迎的:

RewriteRule ^foo/bar/? http://url.com/tacos     # This also matches foo/barb
RewriteRule ^foo/bar/?$ http://url.com/tacos    # This will not match foo/bar/baz

答案 2 :(得分:3)

尝试

RewriteRule ^foo/bar/?$ http://url.com/tacos

答案 3 :(得分:1)

这也有效: RedirectMatch 301 /foo/bar(/.*|$) http://url.com/tacos