(现在怀疑 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 指的是“否定正则表达式”i.e.“!〜”但我一生都无法弄清楚该语句中的语法错误是什么!(顺便说一句,“=~”产生[几乎]相同的消息。)
Apache 正在识别 ${SERVER_TYPE} 语法,因为我可以确认是否拼写错误了标识符。 的文档明确指出应使用“${ident}”而不是“%{ident}”语法,正如我所做的那样。
我的语法有什么问题,为什么 Apache 需要左括号?
我开始谨慎地相信这实际上是一个BUG(!)在 Apache/2.4.12 中,因为解析错误仅在使用“${DEFINED_SYMBOL}”时发生。如果符号没有定义,它会抱怨并做所有正确的事情(所以,它知道它在看什么......),但它给出了一个无意义的(大部头书 ...)当且仅当该构造位于左侧时,才会显示如图所示的消息。
一个明显的解决方法是将符号放在单引号中,例如:
<If "'${SERVER_TYPE}' != /prod/demo/test/">
...但到目前为止,在我的测试中,我认为它没有正确匹配正则表达式。事实上,我还不确定what正在发生,因为以下被认为是non-匹配(“真”):
<If "'prod' !~ /prod|demo|test/">
通过这个 Perl 单行代码可以证明正则表达式语法是正确的:
perl -e 'my $var = "prod"; if ($var =~ /prod|demo|test/) {print "yes\n";}'
...打印“是”。
附: “${IDENT}”语法is在已定义符号的情况下正确(与“%{}”不同,后者不是)。