Обратные ссылки регулярных выражений Apache НЕДОСТУПНЫ в httpd 2.4?

Мне нравится новый 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 существует устаревший (обходной) переключатель... но я не хочу его использовать, так как старые начальный и конечный теги принудительно используются Устаревшие

Выполнение подобных трюков с разбором регулярных выражений w SetEnvIfExpr тоже не помогает


person kjetildm    schedule 18.04.2013    source источник
comment
Обычно их можно использовать только в том же выражении, что и соответствующее регулярное выражение, но некоторые модули допускают специальное использование. Я предполагаю, что это проблема, и вы должны вписать присвоение в одно и то же выражение, какой бы ни была эта область.   -  person slackwing    schedule 19.04.2013


Ответы (3)


путем изменения

{{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}}

можно обойти проблему, используя тот факт, что $ 0, кажется, работает

person lijat    schedule 20.04.2015
comment
Жизнь безопаснее! (не совсем так, но мне это очень помогло) - person Mchl; 03.02.2016

Согласно документации:

Обратные ссылки регулярных выражений Строки $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}}
person Federico Piazza    schedule 08.04.2015
comment
Кажется, это так, но я не думаю, что разработчики Apache стали бы изобретать велосипед! - person hjpotter92; 30.09.2015

person    schedule
comment
Это просто кусок кода, который почти идентичен коду в других ответах. Чтобы этот код был полезным, в нем должно быть объяснение того, что он делает и почему он отвечает на вопрос. Учитывая, что он так похож на код в других ответах, он также должен объяснить, почему он отличается от них. - person AdrianHHH; 30.09.2015