如何重写/ foo,/ foo /,/ foo / bar,但不是/ foofake?

时间:2013-01-09 17:28:52

标签: apache .htaccess

我正在尝试匹配:

http://example.com/foo

http://example.com/foo/

http://example.com/foo/bar

http://example.com/foo/bar/addditional

但不是

http://example.com/foofake

任何人都知道如何做到这一点,或者有人有任何正则表达式吗?

1 个答案:

答案 0 :(得分:0)

我已经看到这个问题被问了很多时间,以及SO和其他地方,我只是想出了这个好的技巧,并希望分享它。

这个RewriteRule正则表达式可行:

RewriteRule ^foo/{0,1}(?![a-z])(.*)

进一步说明:

foo匹配与foo相关的东西。

/{0,1}表示必须有零个或一个尾部斜杠。你可能认为这只会匹配/ foo或/ foo /,但这也匹配/ foofake因为它在foo之后也有任何尾随斜杠。

(?![a-z])这是这个正则表达式的主要部分。这表示方括号内的东西,即[a-z]不应该在foo之后存在。请注意,这仍将匹配其他字符,如/ foo + bar。请继续阅读更复杂的版本。

(.*)在尾部斜杠后匹配任何。这也可以根据需要进行优化。

这是一个使用相同逻辑的更复杂的版本:

foo/{0,1}(?![a-zA-Z0-9`~!@$%^&*()_\-\{\}\[\]\+\=\\\|:;"'>.<,'\s])(.*)$

这个将键盘上的所有字符列入黑名单,这样它们就不会出现在/ foo之后。

您可以在此处查看迷你版本:http://regexr.com?33blp

您可以在此处找到适用的扩展版本:http://regexr.com?33bme

我觉得这种方法有很大的改进空间,所以如果你发现任何缺陷或者找到一种方法让它变得很棒,请发表评论!