Apache RewriteCond和朋友中的正则表达式模式:全部或部分匹配?

时间:2011-04-07 20:23:27

标签: regex apache mod-rewrite

Apache文档states

  

CondPattern是条件模式,   应用的正则表达式   到当前的实例   TestString [...] CondPattern是一个perl   兼容正则表达式   一些补充[...]

并提供了

这样的例子
RewriteCond %{REMOTE_HOST}  ^host1.*  [OR]

我知道Perl正则表达式,但这似乎让我感到困惑:

我们在这里谈的是部分匹配吗? (模式匹配字符串中的某些子字符串,如Perl $string =~ m/pattern/;?)

或者更确切地说是完全匹配? (模式匹配整个字符串,如在Java Pattern.matches(pattern, string)中?)

如果匹配是部分匹配,则尾随.*似乎是多余的。它已经满了,那么^似乎是多余的。

我发现的很多例子,在Apache文档和各处都有这个(对我来说很明显)不一致。

更新:这是文档的问题,现在已经更正了。

2 个答案:

答案 0 :(得分:7)

<强>部分即可。 (示例中.*是多余的。)

Apache使用优秀的PCRE库(虽然是旧版本 - 上次我检查的Rev:5.0 2004),由Phillip Hazel编写,非常像Perl。但我同意,他们的许多例子在正则表达式精度方面都有很多不足之处。

有一些特定于Apache的扩展,例如向模式添加前导!以将NOT逻辑应用于匹配。我找到的最好的文档(您可能已经看过),就是这个页面:Apache Module mod_rewrite

答案 1 :(得分:7)

感谢。我已经删除了我认为你在文档中提到的正则表达式中不必要的。*。如果你找到其他人,请告诉我,我也会解决这些问题。

正则表达式是子串匹配,默认情况下,不需要匹配整个字符串(通常)。 Apache文档中隐含其他内容的地方是错误,需要修复。

当人们完全没必要时,人们往往会把。*放到正则表达式中。