59 votes

Nginx proxy_pass redirections ignorent le port

Donc, je mets en place un chemin virtuel lors de la redirection vers une application node.js dans ma configuration nginx. La section pertinente ressemble à ceci :

location /app {
  rewrite /app/(.*) /$1 break;
  proxy_pass http://localhost:3000;
  proxy_redirect off;
  proxy_set_header Host $host;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

Fonctionne très bien, sauf que lorsque mon application node.js (une application express) appelle une redirection.

Par exemple, la boîte de développement exécute nginx sur le port 8080, et donc les URL vers la racine de l'application node ressemblent à ceci :

http://localhost:8080/app

Lorsque j'appelle une redirection vers '/app' depuis node, la redirection réelle se fait vers :

http://localhost/app

2 votes

Voici quelques réponses suggérant l'utilisation : proxy_set_header Host $http_host; Mais personne n'a mentionné que cela pouvait causer une vulnérabilité (attaque de l'en-tête de l'hôte). Exemple d'attaque ici Et plus d'informations ici

66voto

J'ai dû résoudre le même problème avec Jenkins tournant derrière nginx. Ce qui a fonctionné pour moi était d'inclure le port du serveur dans l'en-tête Host envoyé à Jenkins :

proxy_set_header Host $host:$server_port;

J'espère que cela vous aidera.

6 votes

Bingo. comme le dit @mgorven, node définit mal la redirection, car nginx transmet mal l'hôte

1 votes

OMG, tu n'as pas idée à quel point cela est important pour moi. Tu m'as sauvé la journée mec. En 2016, il y a 6 ans, tu as donné cette réponse, et aujourd'hui cela a sauvé mes journées. Merci :)

31voto

Frank Koehl Points 311

Conformément à la conversation sur cette question, la résolution appropriée consiste à ajuster la directive Host du proxy.

Changer ceci :

proxy_set_header Host $host;

À ceci :

proxy_set_header Host $http_host;

$http_host contient la valeur spécifiée dans l'en-tête HTTP HOST, qui inclut le port. Les redirections devraient prendre en compte le port personnalisé sans nécessiter d'autres personnalisations du paramétrage de l'OP.

Ces réponses (sur le même ticket) développent davantage :

2 votes

J'ai passé 2 jours à essayer de comprendre cela. Merci beaucoup!

22voto

mgorven Points 29736

Le problème est que l'application Node.js ne redirige pas correctement. Vous pouvez peut-être utiliser proxy_redirect pour corriger cela dans nginx:

proxy_redirect http://localhost/ http://localhost:8080/;

7voto

Mark Riggins Points 61

J'ai essayé les solutions ci-dessus, mais elles ont toutes échoué chaque fois que l'application node émettait une URL entièrement qualifiée dans l'en-tête de localisation, telle que "http://nodeapp.com:8080/new/location"

J'ai donc fini par utiliser $http_host pour passer l'hôte et le port. Et en utilisant un match ~^ pour réécrire complètement les URL.

  proxy_pass http://10.0.0.3:8080;

  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header Host $http_host;

  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

  proxy_redirect default;
  proxy_redirect ~^(https?://[^:]+):\d+(?/.+)$ http://10.0.0.3:8000$relpath;

Dans notre cas, le serveur Node fonctionne sur le port 8080, et notre proxy nginx fonctionne sur le port 8000. Cela signifie que chaque URL entièrement qualifiée dans un en-tête de localisation doit être réécrite. J'espère que cela aidera quelqu'un !!

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