2013-04-18 9 views
8

I Love the new apache httpd 2.4 con un sacco di nuove fantastiche cose!Apache regex backreferences UNREACHABLE in httpd 2.4?

ap_expr è una di queste nuove caratteristiche molto promettenti,

..ma il seguente frammento di SSI non funzionano come previsto:

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

Il se funziona, ma la var isn' t set! Questo non ha alcun senso.

error.log dice:

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

Il dottore (http://httpd.apache.org/docs/2.4/expr.html#other) è confusa e non hanno campioni da nessuna parte vicino.

So che c'è un interruttore legacy (soluzione) per SSI .. ma io non voglio usarlo dal vecchio inizio e fine tag sono costrettiLegacy

Facendo simile regex-parsing -tricks w SetEnvIfExpr non aiuta né

+2

"possono normalmente essere utilizzati solo nella stessa espressione come regex matching, ma alcuni moduli permettono usi speciali". Immagino che questo sia il problema, e devi adattare il compito alla "stessa" espressione, qualunque sia quel dominio. –

risposta

0

Secondo il documentation:

espressioni regolari backreference le stringhe $ 0 ... $ 9 permettono di fare riferimento ai gruppi di cattura da un'espressione regolare, eseguita con successo, corrispondente alle espressioni regolari. Normalmente possono essere utilizzati solo nella stessa espressione della regex corrispondente, ma alcuni moduli consentono usi speciali.

Si utilizza un gruppo di cattura e si fa riferimento che l'utilizzo dell'indice 1, questo dovrebbe essere ok utilizzando un motore di espressioni regolari standard, ma secondo la documentazione è possibile fare riferimento da $0...$9. Credo che apache sta riempiendo l'inde 0 con il gruppo di cattura, invece di 1 e questo è si ottiene il regex capture $1 is out of range

Cambiare l'indice $1 a $0 utilizzando:

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

Sembra essere il caso, ma non credo che gli sviluppatori Apache reinventerebbero la ruota! – hjpotter92

+0

@ hjpotter92 lol dispiace amico ... pensavo di averlo fatto –

1

modificando

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

a

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

si può risolvere il problema sfruttando il fatto che $ 0 sembra funzionare

+0

Una vita più sicura!(non proprio, ma questo mi ha aiutato molto) – Mchl

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

Questo è solo un pezzo di codice che è quasi identico al codice in altre risposte. Perché questo codice sia utile dovrebbe avere una spiegazione di cosa fa e perché risponde alla domanda. Dato che è così simile al codice in altre risposte, dovrebbe anche spiegare perché è diverso da loro. – AdrianHHH

Problemi correlati