Apache正则表达式反向引用在httpd 2.4中是否可以访问?

时间:2013-04-18 19:48:59

标签: regex apache ssi server-side-includes mod-include

我喜欢新的 apache httpd 2.4 ,有很多新鲜的东西!

ap_expr是这些新的非常有前途的功能之一,

..但以下SSI代码段无法正常工作:

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

if 正在工作但未设置var!这没有任何意义。

error.log说:

.. AH01330: regex capture $1 is out of range

文档(http://httpd.apache.org/docs/2.4/expr.html#other)令人困惑,没有样本

我知道SSI有一个遗留(变通办法)开关..但我不想使用它,因为强制旧的开始和结束标记 Legacy < / p>

执行类似的正则表达式解析 - 技巧W SetEnvIfExpr也无济于事

3 个答案:

答案 0 :(得分: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似乎可以工作的事实

可以解决问题

答案 1 :(得分:0)

根据documentation

  

正则表达式反向引用   字符串$ 0 ... $ 9允许从先前执行的成功匹配的正则表达式引用捕获组。它们通常只能在与匹配的正则表达式相同的表达式中使用,但某些模块允许特殊用途。

您正在使用捕获组,并且您使用索引1来引用它,使用标准正则表达式引擎应该没问题,但根据您可以从$0...$9引用的文档。我猜apache正在用您的捕获组填充inde 0而不是1,那就是regex capture $1 is out of range

使用以下内容将索引$1更改为$0

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

答案 2 :(得分:0)

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