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 重写规则,可以使用或不使用斜杠的主要内容,如果未能解决你的问题,请参考以下文章

在每个 url 的末尾添加斜杠(需要为 nginx 重写规则)

重写以添加尾部斜杠,但独立于域?

从查询字符串 Apache 中删除尾部斜杠

即使省略斜杠,如何重写 URL 规则?

使用 apache 重写规则的问题

Apache 重写:如何避免在省略 url 结尾斜杠时显示 url 参数?