Les redirections du passage du proxy nginx ignorent le port

34

Je configure donc un chemin virtuel lorsque je pointe vers une application node.js dans mon conf. 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 dialogue de développement exécute nginx sur le port 8080. L'URL à la racine de l'application de noeud ressemble à ceci:

http: // localhost: 8080 / app

Lorsque j'appelle une redirection vers '/ app' depuis le nœud, la redirection actuelle est la suivante:

http: // localhost / app

Paul
la source
Voici quelques réponses suggérant une utilisation: proxy_set_header Host $ http_host; Mais personne n'a dit que cela pouvait entraîner une vulnérabilité (attaque d'en-tête d'hôte). Exemple d'attaque ici Et plus d'infos ici

Réponses:

14

Le problème est que l'application Node.js n'émet pas la redirection correctement. Vous pourrez peut-être utiliser proxy_redirectpour corriger cela dans nginx:

proxy_redirect http://localhost/ http://localhost:8080/;
mgorven
la source
47

Je venais juste de résoudre le même problème avec Jenkins qui courait derrière Nginx. Ce que cela a fait pour moi a été d'inclure le port du serveur dans l'en- Hosttête qui est envoyé à Jenkins:

proxy_set_header Host $host:$server_port;

J'espère que ça t'as aidé.

Vojislav Stojkovic
la source
3
Bingo comme @mgorven le dit, le noeud configure mal la redirection, car nginx
Eric
5

J'ai essayé les solutions ci-dessus, mais elles ont toutes échoué chaque fois que l'application de noeud a généré une URL pleinement qualifiée dans l'en-tête d'emplacement, telle que " http://nodeapp.com:8080/new/location ".

J'ai donc fini par utiliser $ http_host pour transmettre l'hôte et le port. Et en utilisant une correspondance ~ ^ pour réécrire entièrement 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+(?<relpath>/.+)$ http://10.0.0.3:8000$relpath;

Dans notre cas, le serveur de nœud est exécuté sur 8080 et notre proxy nginx sur 8000. Cela signifie que chaque adresse URL complète dans l'en-tête d'un emplacement doit être réécrite. J'espère que cela aide quelqu'un !!

Mark Riggins
la source
4

Selon la conversation sur cette question , la solution appropriée consiste à ajuster la Hostdirective d’en-tête du proxy .

Change ça:

proxy_set_header Host $host;

Pour ça:

proxy_set_header Host $http_host;

$http_hostcontient la valeur spécifiée dans l'en-tête HTTP HOST, qui inclut le port. Les redirections doivent récupérer le port personnalisé sans autre personnalisation de la configuration de l'OP.

Ces réponses (même ticket) précisent:

Frank Koehl
la source