Apache 重写规则,可以使用或不使用斜杠
Posted
技术标签:
【中文标题】Apache 重写规则,可以使用或不使用斜杠【英文标题】:Apache rewrite rule which works with or without a trailing slash 【发布时间】:2011-04-20 02:06:42 【问题描述】:我正在尝试重定向一系列静态 URL,并且无论是否存在斜杠,我都希望它能够工作:
/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
我觉得我错过了一些明显的东西。帮忙?
【问题讨论】:
遇到了同样的问题。我注意到,如果我的文件夹存在(但为空),那么两者都可以使用“RewriteRule ^old/(.*) test.com/new/$1 [R=301,L]”逻辑(存在 test.com/old/)。 【参考方案1】:除了EBNF 或ABNF 之外,正则表达式中的量词指的是前面的表达式,而不是后面的表达式。
所以:
RewriteRule ^foo/bar/?$ http://url.com/tacos
【讨论】:
问号表示“我将有 0 或 1 个尾部斜杠。”你去餐馆说“我要一份炸玉米饼?”你真的是在说“我要 0 或 1 个炸玉米饼。”【参考方案2】:如果你想匹配 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
【讨论】:
我想说你可以在这里省略.*
:RewriteRule ^foo/bar(/|$) http://url.com/tacos
。只有当你真正使用你在那里捕获的东西时,这才有意义。
@arkascha True.【参考方案3】:
试试
RewriteRule ^foo/bar/?$ http://url.com/tacos
【讨论】:
【参考方案4】:这也有效:
RedirectMatch 301 /foo/bar(/.*|$) http://url.com/tacos
【讨论】:
以上是关于Apache 重写规则,可以使用或不使用斜杠的主要内容,如果未能解决你的问题,请参考以下文章