在httpd 2.4中,Apache正则表达式的反向引用是否无法到达?

8
我喜欢新的apache httpd 2.4,其中有很多新的酷炫功能! ap_expr是其中一个非常有前途的新功能,
但以下SSI代码片段未能按预期工作:
{{if expr="v('HTTP_SESSION') =~ /-user=([^&]+)/"}} 
{{set var="user" value="$1"}} 
{{endif}}
if正常工作,但是变量未被设置!这没有任何意义。

error.log显示:
.. AH01330: regex capture $1 is out of range

这份文档 (http://httpd.apache.org/docs/2.4/expr.html#other) 很令人困惑, 而且没有示例可以参考。

我知道SSI有一个旧的(workaround)开关..但是我不想使用它,因为旧的Start-和End-tags被强制执行Legacy

使用SetEnvIfExpr进行类似的regex-parsing-trick也没有帮助。


2
它们通常只能与匹配的正则表达式在同一表达式中使用,但某些模块允许特殊用途。我想这就是问题所在,你必须将任务适应于“相同”的表达式,无论该领域是什么。 - Andrew Cheong
3个回答

1
通过改变

标签来实现。

{{if expr="v('HTTP_SESSION') =~ /-user=([^&]+)/"}} 
    {{set var="user" value="$1"}} 
{{endif}}

{{if expr="v('HTTP_SESSION') =~ /-user=([^&]+)/"}} 
    {{set var="user" value="$0"}}
    {{if expr="v('user') =~ /([^&]+)$/"}}
         {{set var="user" value="$0"}}
    {{endif}}
{{endif}}

可以通过利用$0似乎有效的事实来解决这个问题。


一个救命稻草!(其实不是真的,但这对我帮助很大) - Mchl

0
{{if expr="v('HTTP_SESSION') =~ /-user=([^&]+)/ && $1 =~ /(.+)/"}} 
    {{set var="user" value="$0"}} 
{{endif}}

这只是一堆代码,几乎与其他答案中的代码完全相同。为了使此代码有用,它应该有一个解释它做什么以及为什么它回答了问题的解释。鉴于它与其他答案中的代码如此相似,它还应该解释为什么与它们不同。 - AdrianHHH

0
根据文档
引用正则表达式 字符串$0 ... $9允许引用先前执行的成功匹配的正则表达式中的捕获组。它们通常只能在与匹配正则表达式相同的表达式中使用,但某些模块允许特殊用途。
您正在使用捕获组,并使用索引1进行引用,这在标准正则表达式引擎中应该是可以的,但根据文档,您可以从$0...$9进行引用。我猜Apache正在使用您的捕获组填充索引0而不是1,这就是为什么您会得到“regex capture $1 is out of range”的原因。
通过使用以下内容将索引$1更改为$0:
{{if expr="v('HTTP_SESSION') =~ /-user=([^&]+)/"}} 
{{set var="user" value="$0"}} 
{{endif}}

看起来是这样,但我不认为Apache开发人员会重新发明轮子! - hjpotter92

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接