3 votes

La carte Nginx n'utilise pas les arguments de mon expression régulière.

Je suis en train d'essayer d'utiliser la carte de NGINX, mais les résultats ne sont pas ceux auxquels je m'attends.

Voici ce que j'ai :

map $uri $new {
  default                                 "";
  ~*/cc/(?P.*)$                   test.php?suffix=$suffix;
}

location ~     [a-zA-Z0-9/_]+$ {
        proxy_pass http://www.domain.com:81/$new;
        proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header Host $host;
        proxy_set_header X-Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

Quand je vais sur www.domain.com/cc/abc, voici ce que je vois dans les journaux

2012/03/29 17:27:53 [warn] 3382#0: *33 une réponse de l'amont est mise en mémoire tampon dans un fichier temporaire /var/cache/nginx/proxy_temp/5/00/0000000005 pendant la lecture de l'amont, client: 1.2.3.4, serveur: www.domain.com, requête: "GET /cc/abc HTTP/1.1", amont: "http://1270.0.0.1:81/test.php?suffix=$suffix", hôte: "www.domain.com"

Le $suffix n'est pas remplacé.

Mais quand je fais ceci :

map $uri $new {
  default                                 "";
  ~*/cc/(?P.*)$                   $suffix;
}

location ~     [a-zA-Z0-9/_]+$ {
        proxy_pass http://www.domain.com:81/$new;
        proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header Host $host;
        proxy_set_header X-Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

Et maintenant, quand je vais sur www.domain.com/cc/abc, les journaux me montrent ceci :

2012/03/29 17:29:39 [warn] 5916#0: *26 une réponse de l'amont est mise en mémoire tampon dans un fichier temporaire /var/cache/nginx/proxy_temp/2/00/0000000002 pendant la lecture de l'amont, client: 1.2.3.4, serveur: www.domain.com, requête: "GET /cc/abc HTTP/1.1", amont: "http://1270.0.01:81/abc", hôte: "www.domain.com"

Donc, quand la réécriture contient une chaîne incluant la variable, elle n'est pas remplacée. Mais si elle contient seulement la variable, cela fonctionnera.

Qu'est-ce que je fais de mal ?

8voto

kolbyjack Points 4721

Comme vous l'avez découvert, les remplacements de cartes ne peuvent être qu'une chaîne statique ou une seule variable. Comme test.php?suffix=$suffix ne commence pas par un $, nginx suppose que c'est juste une chaîne statique. Au lieu d'utiliser une carte, vous devrez utiliser deux réécritures pour accomplir ce que vous voulez:

location ~ [a-zA-Z0-9/_]+$ {
  rewrite ^/cc/(.*) /test.php?suffix=$1 break;
  rewrite ^ / break;

  proxy_pass http://www.domain.com:81;
  proxy_set_header X-Real-IP  $remote_addr;
  proxy_set_header Host $host;
  proxy_set_header X-Host $host;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

La première réécriture supprimera toute /cc/ initiale de l'URL et ajoutera le reste comme argument d'URL comme votre map essayait de le faire. Le drapeau break indique à nginx d'arrêter de traiter les directives de réécriture. Si la première réécriture ne correspond pas, alors la seconde correspondra toujours, et définira l'URL sur /.

EDIT: À partir de 1.11.0, les valeurs de carte peuvent être des valeurs complexes, donc la configuration originale fonctionnerait

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X