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

Luk*_*nis 19 regex url rewrite

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

/foo/bar  --->  /tacos
/foo/bar/  -->  /tacos
Run Code Online (Sandbox Code Playgroud)

我已经尝试了以下各种变化,但我总是只得到一个匹配的斜杠:

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
Run Code Online (Sandbox Code Playgroud)

我觉得我错过了一些明显的东西.救命?

Gum*_*mbo 35

除了在EBNFABNF中,正则表达式中的量词指的是前面的表达式而不是下面的表达式.所以:

RewriteRule ^foo/bar/?$ http://url.com/tacos
Run Code Online (Sandbox Code Playgroud)

  • 问号说"我将有0或1个斜杠." 你去餐馆说"我要吃炸玉米饼吗?" 你真的在说"我要吃0或1个炸玉米饼." (7认同)

ful*_*ulv 13

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

RewriteRule ^foo/bar(/.*|$) http://url.com/tacos
Run Code Online (Sandbox Code Playgroud)

这将符合以下任何一项:

foo/bar
foo/bar/
foo/bar/baz
Run Code Online (Sandbox Code Playgroud)

它表示:匹配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
Run Code Online (Sandbox Code Playgroud)