Apache'if'指令中的正则表达式...这里有什么问题?

时间:2016-03-15 19:37:00

标签: regex apache if-statement configuration

(现在怀疑Apache中可能出现的错误......见下文。)

以下是陈述:(Apache 2.4)

<IfDefine !SERVER_TYPE>
    Define SERVER_TYPE prod
</IfDefine>
<If "${SERVER_TYPE} !~ /prod|demo|test/">   <===error here===
    Error "Define 'SERVER_TYPE' is hosed'"
</If>

Apache抱怨IF:

Cannot parse condition clause: syntax error, unexpected T_OP_NRE, expecting '('

我可以猜测T_OP_NRE是指“否定的正则表达式”“!〜”但我不能为我的生活弄清楚该语句中的语法错误是什么! (顺便说一句,“=〜”产生[几乎]相同的信息。)

Apache正在识别$ {SERVER_TYPE}语法,因为我可以确认是否拼错了标识符。 &lt; DEFINE&gt;的文档明确指出应该使用“$ {ident}”而不是“%{ident}”语法,正如我所做的那样。

我的语法有什么问题,为什么Apache期望左括号?

我小心翼翼地开始相信这实际上是Apache / 2.4.12中的 BUG(!),因为只有在使用“$ {DEFINED_SYMBOL}”时才会出现解析错误。如果没有定义符号,它会抱怨并做所有正确的事情(因此,它知道它在看什么...),但它给出了一个荒谬的(对我来说)消息 - 如果且仅当此构造位于左侧时显示。

一个明显的解决方法是将符号放在单引号中,例如:

<If "'${SERVER_TYPE}' != /prod/demo/test/">

...但在我的测试中,我认为它与正确的正则表达不匹配。事实上,我还不确定正在进行什么,因为以下内容被认为是 -match(“true”):

<If "'prod' !~ /prod|demo|test/">

通过Perl one-liner可以证明正则表达式语法是正确的:

perl -e 'my $var = "prod"; if ($var =~ /prod|demo|test/) {print "yes\n";}'

...打印“是”。

P.S。 “$ {IDENT}”语法 正确(对于“%{}”,对于已定义的符号,则不是)。

1 个答案:

答案 0 :(得分:0)

试试这个语法:

<If "'${SERVER_TYPE}' !~ m#(prod|demo|test)#">
    #Error "Define 'SERVER_TYPE' is hosed"
    RedirectMatch /old /new/
</If>