kjetildm
kjetildm

Reputation: 294

Apache regex backreferences UNREACHABLE in httpd 2.4?

I Love the new apache httpd 2.4 with lots of new cool stuff !

ap_expr is one of these new very promising features,

..BUT the following SSI snippet don't work as expected:

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

The if is working BUT the var isn't set ! This doesn't make any sense.

error.log says:

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

The doc (http://httpd.apache.org/docs/2.4/expr.html#other) is confusing and have no samples anywhere near.

I know that there is a legacy (workaround) switch for SSI.. but I don't want to use it since old Start- and End-tags are forced Legacy

Doing similar regex-parsing-tricks w SetEnvIfExpr is not helping either

Upvotes: 8

Views: 1403

Answers (3)

Leineweber
Leineweber

Reputation: 1

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

Upvotes: 0

lijat
lijat

Reputation: 690

by changing

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

to

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

one can work around the problem using the fact that $0 seems to work

Upvotes: 1

Federico Piazza
Federico Piazza

Reputation: 31035

According to the documentation:

Regular expression backreferences The strings $0 ... $9 allow to reference the capture groups from a previously executed, successfully matching regular expressions. They can normally only be used in the same expression as the matching regex, but some modules allow special uses.

You are using a capturing group and you are referencing that using index 1, this should be ok using a standard regex engine, but according to the documentation you can reference from $0...$9. I guess apache is filling the inde 0 with your capturing group instead of 1 and that's you get the regex capture $1 is out of range

Change the index $1 to $0 by using:

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

Upvotes: 0

Related Questions