Обратные ссылки регулярных выражений Apache недостижимы в httpd 2.4?

Я люблю новый Apache httpd 2.4 с большим количеством новых интересных вещей!

ap_expr является одной из этих новых очень многообещающих функций,

..Но следующий фрагмент кода SSI не работает должным образом:

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

Если работает, но переменная не установлена! Это не имеет никакого смысла.

error.log говорит:

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

Документ ( http://httpd.apache.org/docs/2.4/expr.html) сбивает с толку и не имеет образцов рядом.

Я знаю, что есть устаревший (обходной) переключатель для SSI... но я не хочу использовать его, так как старые Start- и End-теги являются принудительными Legacy

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

3 ответа

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

{{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, кажется, работает

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

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

Обратные ссылки на регулярные выражения Строки $0 ... $9 позволяют ссылаться на группы захвата из ранее выполненных, успешно соответствующих регулярных выражений. Обычно они могут использоваться только в том же выражении, что и соответствующее регулярное выражение, но некоторые модули допускают специальное использование.

Вы используете группу захвата и ссылаетесь на нее, используя индекс 1, это должно быть нормально, используя стандартный движок регулярных выражений, но в соответствии с документацией вы можете ссылаться из $0...$9, Я думаю, Apache заполняет 0 с вашей группой захвата вместо 1 и вот ты получаешь regex capture $1 is out of range

Изменить индекс $1 в $0 используя:

{{if expr="v('HTTP_SESSION') =~ /-user=([^&]+)/"}} 
{{set var="user" value="$0"}} 
{{endif}}
Другие вопросы по тегам