Nginx proxy pass przekierowuje zignoruj ​​port

34

Więc konfiguruję wirtualną ścieżkę, wskazując na aplikację node.js w moim nginx conf. odpowiednia sekcja wygląda tak:

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;
}

Działa świetnie, z tym wyjątkiem, że moja aplikacja node.js (aplikacja ekspresowa) wywołuje przekierowanie.

Na przykład w polu dewelopera działa nginx na porcie 8080, więc adres URL do katalogu głównego aplikacji węzła wygląda następująco:

http: // localhost: 8080 / app

Kiedy wywołuję przekierowanie do „/ app” z węzła, rzeczywiste przekierowanie przechodzi do:

http: // localhost / app

Paweł
źródło
Oto kilka odpowiedzi, które sugerują użycie: proxy_set_header Host $ http_host; Ale nikt nie powiedział, że może powodować podatność (atak nagłówka hosta). Przykład ataku tutaj I więcej informacji tutaj

Odpowiedzi:

14

Problem polega na tym, że aplikacja Node.js nieprawidłowo wydaje przekierowanie. Możesz użyć proxy_redirecttej metody w celu skorygowania tego w nginx:

proxy_redirect http://localhost/ http://localhost:8080/;
mgorven
źródło
47

Właśnie musiałem rozwiązać ten sam problem z Jenkinsem działającym za nginx. Zrobiłem to, włączając port serwera do Hostnagłówka wysyłanego do Jenkinsa:

proxy_set_header Host $host:$server_port;

Mam nadzieję, że to pomaga.

Vojislav Stojkovic
źródło
3
Bingo jak mówi @mgorven, węzeł źle ustawia przekierowanie, ponieważ nginx źle przekazuje hosta
Eric
5

Próbowałem powyższych rozwiązań, ale wszystkie one zawiodły za każdym razem, gdy aplikacja węzła wydała w pełni kwalifikowany adres URL w nagłówku lokalizacji, na przykład „ http://nodeapp.com:8080/new/location

Więc skończyłem używając $ http_host do przekazania hosta i portu. I używając dopasowania ~ ^, aby całkowicie przepisać adresy 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;

W naszym przypadku serwer Node działa na 8080, a nasz serwer proxy nginx na 8000. Oznacza to, że każdy w pełni kwalifikowany adres URL w nagłówku lokalizacji musi zostać przepisany. Mam nadzieję, że to komuś pomoże !!

Mark Riggins
źródło
4

W przypadku rozmowy dotyczącej tego pytania poprawnym rozwiązaniem jest dostosowanie Hostdyrektywy nagłówka proxy .

Zmień to:

proxy_set_header Host $host;

Do tego:

proxy_set_header Host $http_host;

$http_hostprzechowuje wartość określoną w nagłówku HTTP HOST, który obejmuje port. Przekierowania powinny odebrać niestandardowy port bez dalszego dostosowywania konfiguracji OP.

Te odpowiedzi (ten sam bilet) dopracowują:

Frank Koehl
źródło