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

2023-12-26

(现在怀疑 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在已定义符号的情况下正确(与“%{}”不同,后者不是)。


试试这个语法:

<If "'${SERVER_TYPE}' !~ m#(prod|demo|test)#">
    #Error "Define 'SERVER_TYPE' is hosed"
    RedirectMatch /old /new/
</If>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Apache 'if' 指令中的正则表达式...这里出了什么问题? 的相关文章

随机推荐