Захват переменной в сопоставлении местоположения Nginx
Скажем, у меня есть такой URL: www.example.com/a/b/sth
, и я пишу блок местоположения в конфигурации Nginx:
location ^~ /a/b/(?<myvar>[a-zA-Z]+) {
# use variable $myvar here
if ($myvar = "sth") { ... }
}
Я надеюсь, что сможет использовать переменную $myvar
, захваченную из URL-адреса внутри блока, однако Nginx продолжает сообщать мне, что эта переменная не определена и не запускается:
nginx: [emerg] unknown "myvar" variable
Ответы
Ответ 1
Именованные захваты - это функция PCRE, и они имеют различный синтаксис, доступные в разных версиях. Для синтаксиса, который вы используете ?<var>
, вы должны иметь PCRE 7.0 по крайней мере.
Пожалуйста, ознакомьтесь с обширной информацией в официальной документации Nginx
Ответ 2
Старый поток, но у меня была та же проблема...
Я думаю, что ошибка не связана с установленной версией PCRE
NGINX не анализирует ваше регулярное выражение, если тэг местоположения не начинается с ~
Вам нужно использовать что-то вроде этого
location ~ ^/a/b/(?<myvar>[a-zA-Z]+) {
# use variable $myvar here
if ($myvar = "sth") { ... }
}
Ответ 3
^ ~ не соответствует регулярному выражению, он содержит самый длинный совпадающий префикс.
вы должны использовать ~ или ~ * (case insenstive) вместо
Ответ 4
Неподтвержденный, но правильный способ захвата блока в именованную переменную с помощью PCRE - (? P). Таким образом, ваш пример пропускает P.