(现在怀疑 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} 语法,因为我可以确认是否拼写错误了标识符。
我的语法有什么问题,为什么 Apache 需要左括号?
<小时/>我开始谨慎地相信这实际上是 Apache/2.4.12 中的一个 BUG(!),因为解析错误仅在使用“${DEFINED_SYMBOL}”时发生。如果符号没有定义,它会提示并做所有正确的事情(所以,它知道它在看什么......),但它给出了一个无意义的(对我来说......)消息: - 当且仅当此构造位于左侧时才显示。
一个明显的解决方法是将符号放在单引号中,例如:
<If "'${SERVER_TYPE}' != /prod/demo/test/">
...但到目前为止,在我的测试中,我认为它没有正确匹配正则表达式。事实上,我还不确定发生了什么,因为以下内容被认为是非匹配(“true”):
<If "'prod' !~ /prod|demo|test/">
通过这个 Perl 单行代码可以证明正则表达式语法是正确的:
perl -e 'my $var = "prod"; if ($var =~ /prod|demo|test/) {print "yes\n";}'
...打印"is"。
<小时/>附注对于已定义符号,“${IDENT}”语法是正确的(而“%{}”则不是)。
最佳答案
尝试这个语法:
<If "'${SERVER_TYPE}' !~ m#(prod|demo|test)#">
#Error "Define 'SERVER_TYPE' is hosed"
RedirectMatch /old /new/
</If>
关于Apache 'if' 指令中的正则表达式...这里出了什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36020563/