(现在怀疑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}”语法 正确(对于“%{}”,对于已定义的符号,则不是)。
答案 0 :(得分:0)
试试这个语法:
<If "'${SERVER_TYPE}' !~ m#(prod|demo|test)#">
#Error "Define 'SERVER_TYPE' is hosed"
RedirectMatch /old /new/
</If>