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

标签 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} 语法,因为我可以确认是否拼写错误了标识符。 的文档明确指出应使用“${ident}”而不是“%{ident}”语法,正如我所做的那样。

我的语法有什么问题,为什么 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/

相关文章:

javascript - 使用 RegExp 验证文胸尺寸(美国、欧盟、日本、澳大利亚)

mysql - 删除 NiFi 中的重复项

c++ - 我正在尝试在 If 语句中使用数组

c - 为什么这个 if 语句不起作用?

loops - 卡在 Clojure 循环中,需要一些指导

regex - 为什么这个正则表达式返回的组比它应该返回的多?

regex - 基于R中的点拆分文本

python - 如何修改此正则表达式以在 Django 中接受此 URL?

python - 没有名为 urls 的模块/django + mod_wsgi 没有响应

apache - 将数据从一个集群复制到另一个集群时 Hadoop Distcp 中止