web-dev-qa-db-fra.com

capture de variable dans la correspondance d'emplacement Nginx

Disons que j'ai une URL comme celle-ci: www.example.com/a/b/sth, et j'écris un bloc d'emplacement dans la configuration Nginx:

location ^~ /a/b/(?<myvar>[a-zA-Z]+) {
    # use variable $myvar here
    if ($myvar = "sth") { ... }
}

J'espère pouvoir utiliser la variable $myvar capturé à partir de l'URL à l'intérieur le bloc, cependant, Nginx continue de me dire que cette variable n'est pas définie et ne démarre pas:

nginx: [emerg] unknown "myvar" variable
35
skyork

Comme Stefano Fratini l'a correctement souligné dans sa réponse, votre déclaration location contient une erreur: pour les expressions régulières, vous devez utiliser ~ seul, pas ^~.


Les captures nommées sont une fonctionnalité de PCRE et leur syntaxe est disponible dans différentes versions. Pour la syntaxe que vous utilisez ?<var> vous devez avoir au moins PCRE 7.0.

Veuillez consulter les informations détaillées dans documentation officielle Nginx

13
Alexander Azarov

Vieux fil mais j'ai eu le même problème ...

Je pense que l'erreur n'est pas liée à la version PCRE installée

NGINX n'analyse pas votre expression régulière si votre balise de localisation ne commence pas par ~ Vous devez utiliser quelque chose comme ça

location ~ ^/a/b/(?<myvar>[a-zA-Z]+) {
   # use variable $myvar here
   if ($myvar = "sth") { ... }
}
57
Stefano Fratini

^ ~ n'est pas une correspondance regex, il contient le préfixe correspondant le plus long. vous devez utiliser ~ ou ~ * (insensible à la casse) à la place

6
yabo

Non testé, mais la bonne façon de capturer un bloc dans une variable nommée à l'aide de PCRE est (? P). Votre exemple manque donc le P.

3
Melvyn