Обратные ссылки регулярных выражений 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}}