2013-04-18 23 views
8

Kocham nowy apache httpd 2.4 z mnóstwem nowych fajnych rzeczy!Apache regex backreferences UNREACHABLE w httpd 2.4?

ap_expr jest jednym z bardzo obiecujących nowych funkcji,

..ale dodaje SSI snippet nie działają zgodnie z oczekiwaniami:

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

jeśli działa, ale ISN var” t zestaw! To nie ma sensu.

error.log mówi:

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

Doc (http://httpd.apache.org/docs/2.4/expr.html#other) jest mylące i nie mają próbek wszędzie blisko.

wiem, że tam jest dziedzictwem (obejście) Przełącznik dla SSI .. ale nie chcę go używać od starego Start- i końcowego znaczniki są zmuszeniLegacy

Doing podobną regex-parsowania -tricks w SetEnvIfExpr nie pomaga albo

+2

„Mogą być normalnie używany tylko w tej samej wypowiedzi jako regex dopasowania, ale niektóre moduły pozwalają zastosowań specjalnych.” Wyobrażam sobie, że to jest problem, a ty musisz dopasować zadanie do "tego samego" wyrażenia, bez względu na domenę. –

Odpowiedz

0

Według documentation:

wyrażenie regularne wsteczne strun 0 $ ... $ 9 pozwalają odwołać się do grupy przechwytywania z wcześniej wykonanych, poprawnie dopasowanych wyrażeń regularnych. Zwykle można ich używać tylko w tym samym wyrażeniu co pasujące wyrażenie, ale niektóre moduły dopuszczają specjalne zastosowania.

Używasz grupę przechwytywania i odwołują się, że za pomocą indeksu 1, powinno to być ok użyciu standardowego silnika regex, ale zgodnie z dokumentacją można odwoływać od $0...$9. Chyba apache wypełnia Inde 0 z grupy przechwytywania zamiast 1 a to można uzyskać regex capture $1 is out of range

Zmiana indeksu $1 do $0 za pomocą:

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

Wydaje się, że tak jest, ale nie sądzę, żeby twórcy Apache wymyślili na nowo koło! – hjpotter92

+0

@ hjpotter92 lol sorry man ... myślałeś, że zrobiłeś –

1

zmieniając

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

do:

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

można obejść problem wykorzystując fakt, że $ 0 wydaje się działać

+0

Życie bezpieczniejsze!(niezupełnie, ale to bardzo mi pomogło) – Mchl

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

To tylko bryła kodu, która jest prawie identyczna z kodem w innych odpowiedziach. Aby ten kod był użyteczny, powinien zawierać wyjaśnienie, co robi i dlaczego odpowiada na pytanie. Biorąc pod uwagę, że jest on tak podobny do kodu w innych odpowiedziach, powinien również wyjaśnić, dlaczego jest inny od nich. – AdrianHHH

Powiązane problemy