nginx proxy pass redirect mengabaikan port


34

Jadi saya mengatur jalur virtual ketika menunjuk pada aplikasi node.js di nginx conf saya. bagian yang relevan seperti:

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

Berfungsi bagus, kecuali ketika aplikasi node.js saya (aplikasi ekspres) memanggil redirect.

Sebagai contoh, kotak dev menjalankan nginx pada port 8080, dan url ke root aplikasi node terlihat seperti:

http: // localhost: 8080 / app

Ketika saya memanggil redirect ke '/ app' dari node, redirect sebenarnya pergi ke:

http: // localhost / app


Berikut beberapa jawaban yang menyarankan untuk digunakan: proxy_set_header Host $ http_host; Tetapi tidak ada yang mengatakan bahwa hal itu dapat menyebabkan kerentanan (host header attack). Contoh serangan di sini Dan info lebih lanjut di sini

Jawaban:


14

Masalahnya adalah bahwa aplikasi Node.js tidak mengeluarkan pengalihan dengan benar. Anda dapat menggunakan proxy_redirectuntuk memperbaikinya di nginx:

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

47

Saya hanya harus menyelesaikan masalah yang sama dengan Jenkins berjalan di belakang nginx. Apa yang saya lakukan adalah memasukkan port server ke Hostheader yang dikirim ke Jenkins:

proxy_set_header Host $host:$server_port;

Semoga itu bisa membantu.


3
Bingo. seperti @mgorven berkata, node mengatur redirect buruk, karena nginx meneruskan host dengan buruk
Eric

5

Saya mencoba solusi di atas, tetapi semuanya gagal setiap kali aplikasi node mengeluarkan URL yang sepenuhnya memenuhi syarat di header lokasi, seperti " http://nodeapp.com:8080/new/location "

Jadi saya akhirnya menggunakan $ http_host untuk melewati host dan port. Dan menggunakan kecocokan ~ ^ untuk menulis ulang url sepenuhnya.

  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;

Dalam kasus kami, server Node berjalan pada 8080, dan proxy nginx kami berjalan pada 8000. Ini berarti bahwa setiap URL yang sepenuhnya memenuhi syarat di header lokasi perlu ditulis ulang. Semoga ini bisa membantu seseorang !!


4

Per percakapan tentang pertanyaan ini , resolusi yang tepat adalah menyesuaikan proxyHost arahan header .

Ubah ini:

proxy_set_header Host $host;

Untuk ini:

proxy_set_header Host $http_host;

$http_hostmemegang nilai sebagaimana ditentukan dalam header HTTP HOST, yang mencakup porta. Pengalihan harus mengambil port khusus tanpa penyesuaian lebih lanjut untuk pengaturan OP.

Jawaban ini (tiket yang sama) menjelaskan lebih lanjut:

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.