68 votes

Nginx localisation regex ne fonctionne pas avec proxy pass

Je suis en train d'essayer de faire fonctionner ces 2 directives de localisation dans Nginx mais je reçois des erreurs lorsque je démarre Nginx.

   location ~ ^/smx/(test|production) {
        proxy_pass   http://localhost:8181/cxf;
    }

    location ~ ^/es/(test|production) {
        proxy_pass   http://localhost:9200/;
    }

Voici l'erreur que je reçois :

nginx: [emerg] "proxy_pass" ne peut pas avoir de partie URI dans l'emplacement donné par une expression régulière, ou à l'intérieur d'un emplacement nommé, ou à l'intérieur d'une déclaration "if", ou à l'intérieur d'un bloc "limit_except"

Cela vous semble-t-il familier ? Qu'est-ce que j'ai oublié ici ?

73voto

farktronix Points 901

Un petit ajout à la grande réponse de Xaviar:

Si vous n'êtes pas très familier avec nginx, il y a une différence importante entre ajouter le slash à la fin de la directive proxy_pass.

Le suivant ne fonctionne pas:

location ~* ^/dir/ {
  rewrite ^/dir/(.*) /$1 break;
  proxy_pass http://backend/;

mais celui-ci le fait:

location ~* ^/dir/ {
  rewrite ^/dir/(.*) /$1 break;
  proxy_pass http://backend;

La différence étant le / à la fin de la directive proxy_pass.

4 votes

Cette barre oblique finale / a corrigé mon problème de configuration, c'était difficile à repérer, merci!

0 votes

Réécrire ne fonctionne pas pour POST malheureusement

0 votes

Section 3 de liaohuqiu.net/posts/nginx-proxy-pass a aidé dans mon cas

34voto

berto Points 221

Il vous indique que l'URI dans la directive de proxy pass ne peut pas être utilisée dans une location regex. Cela est dû au fait que nginx ne peut pas remplacer la partie de l'URI correspondant à la regex dans le bloc location avec celle passée dans la directive proxy_pass de manière générique.

Imaginez simplement que votre regex de location est /foo/(.*)/bar, et que vous spécifiez proxy_pass http://server/test, nginx devrait alors mapper votre regex de location vers une autre au niveau supérieur car vous ne voulez pas obtenir /foo/test/bar/something mais /test/something. Cela n'est donc pas possible nativement.

Ainsi, pour cette partie, l'utilisation suivante devrait fonctionner :

server {

   [ ... ]

    location ~ ^/smx/(test|production) {
        rewrite ^/smx/(?:test|production)/(.*)$ /cxf/$1 break;
        proxy_pass http://localhost:8181;
    }

    location ~ ^/es/(test|production) {
        rewrite ^/es/(?:test|production)/(.*)$ /$1 break;
        proxy_pass http://localhost:9200;
    }

}

Cependant, il ne sera pas possible de réécrire les redirections pour correspondre au modèle d'URI du bloc de location car il réécrit l'URI actuel en cours de traitement, rendant impossible de changer l'en-tête Location en fonction de la requête initiale avant la réécriture.

2 votes

Déplacer le chemin dans une règle de réécriture a fonctionné pour moi. merci.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X