Nginx membalikkan pengalihan proxy

14

Saya menggunakan nginxsebagai proksi terbalik dan ketika saya masuk di antarmuka web saya, saya diarahkan ke URL yang diproksi. Saya ingin menghindarinya dan selalu menyimpan "server_name" sebagai URL. Apa itu mungkin?

Ini milik saya /etc/nginx/conf.d/my_app.conf:

server { 
    listen 443 ssl; 
    server_name my-app.net; 
    ssl_certificate /etc/pki/tls/certs/my-app.cer; 
    ssl_certificate_key /etc/pki/tls/private/my-app.key; 
    ssl_protocols TLSv1.1 TLSv1.2; 
    access_log /var/log/nginx/my-app.access.log main; 

    location / { 
        proxy_pass http://ip_of_the_app:7180/; 
        proxy_redirect off; 
    } 
} 

Saya terhubung http://my-app.net, memasukkan informasi login, saya kemudian diarahkan ke http://ip_of_the_app:7180halaman login yang sama, dan saya harus login lagi. Bisakah login ganda ini dihindari?

tonio94
sumber
tonio94, apakah masalah Anda sudah diatasi? jika ya, terimalah jawabannya. jika tidak, mohon klarifikasi apa yang hilang.
cnst
2
Saya baru saja mengujinya kemarin, berfungsi, proxy_redirect harus dihapus. Terima kasih untuk bantuannya.
tonio94

Jawaban:

26

Tidak menetapkan proxy_redirectuntuk off, yang tidak melakukan apa yang Anda pikir itu adalah melakukan. proxy_redirectmelakukan sesuatu yang mirip dengan penulisan ulang URL, misalnya:

location /sales/ { 
    proxy_pass http://ip_of_the_app:7180/; 
    proxy_redirect http://ip_of_the_app:7180/ http://$host/sales/; 
}

Ini memungkinkan Anda meng-host /sales/jalur di tempat lain. Tetapi bahkan kemudian, parameter default untuk proxy_redirectmelakukan hal itu untuk Anda secara gratis. Defaultnya adalah untuk mengarahkan ulang lokasi ke apa pun yang ada proxy_pass(dan parameter default digunakan ketika Anda tidak mengatur proxy_redirectsama sekali, atau menggunakan proxy_redirect default;).

Anda tidak perlu mengatur proxy_redirect.


Apa yang Anda lewatkan adalah tajuk yang perlu dikirim ke aplikasi. Yang paling penting dari mereka adalah HOST. Ini akan melakukan proxy yang diinginkan dan akan menjaga URL yang benar di browser.

location / { 
    proxy_pass http://ip_of_the_app:7180/; 
    proxy_set_header HOST $host;
}

Perhatikan bahwa aplikasi at http://ip_of_the_app:7180/sekarang akan menerima permintaan dengan Host: my-app.nettajuk.


Anda juga harus mempertimbangkan menggunakan beberapa tajuk lagi:

proxy_set_header Referer $http_referer;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;

Ini akan memungkinkan untuk masuk lebih baik ke dalam aplikasi di http://ip_of_the_app:7180/. X-Forwarded-Formemberikan IP dari klien aktual (sebagai lawan nginxdari IP s) dan X-Forwarded-Protountuk memeriksa apakah klien terhubung ke nginxmelalui HTTP atau HTTPS.

grochmal
sumber
Terima kasih atas bantuan Anda. proxy_redirect tidak diperlukan tetapi proxy_set_header Referer ip_of_the_app: 7180 harus diatur agar berfungsi dengan benar.
tonio94
@ tonio94 - Terima kasih, saya memperbarui jawabannya. Perhatikan bahwa penggunaan normal Refererhanya $http_referermenyalin dari permintaan. Itu tidak berfungsi jika permintaan tidak memiliki tajuk Referer, oleh karena itu hardcoding adalah solusi dalam beberapa kasus.
grochmal
@JonathanKomar - Terima kasih untuk itu, Anda benar, sekarang diedit. Maaf butuh beberapa saat untuk memperhatikan komentar Anda.
grochmal
@ grochmal Terima kasih, pada dasarnya Anda menyelamatkan hidup saya dengan info tentang: proxy_set_header HOST $ host;
Obay Abd-Algader