Inilah nginx vhost conf yang disingkat:
upstream gunicorn {
server 127.0.0.1:8080 fail_timeout=0;
}
server {
listen 80;
listen 443 ssl;
server_name domain.com ~^.+\.domain\.com$;
location / {
try_files $uri @proxy;
}
location @proxy {
proxy_pass_header Server;
proxy_redirect off;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Scheme $scheme;
proxy_connect_timeout 10;
proxy_read_timeout 120;
proxy_pass http://gunicorn;
}
}
Server yang sama perlu melayani HTTP dan HTTPS, namun, ketika upstream mengeluarkan redirect (misalnya, setelah formulir diproses), semua permintaan HTTPS dialihkan ke HTTP. Satu-satunya hal yang saya temukan yang akan memperbaiki masalah ini berubah proxy_redirect
menjadi sebagai berikut:
proxy_redirect http:// https://;
Itu bekerja sangat baik untuk permintaan yang datang dari HTTPS, tetapi jika redirect dikeluarkan melalui HTTP, itu juga mengarahkan kembali ke HTTPS, yang merupakan masalah.
Karena putus asa, saya mencoba:
if ($scheme = 'https') {
proxy_redirect http:// https://;
}
Tapi nginx mengeluh yang proxy_redirect
tidak diizinkan di sini.
Satu-satunya pilihan lain yang bisa saya pikirkan adalah mendefinisikan dua server secara terpisah dan proxy_redirect
hanya menetapkan pada satu SSL, tapi kemudian saya akan menduplikasi sisa dari conf (ada banyak dalam server
direktif yang saya hilangkan demi kesederhanaan). Saya tahu saya juga bisa menggunakan include
arahan untuk faktor redundansi, tapi saya benar-benar ingin menyimpan hanya satu file conf tanpa ketergantungan.
Jadi, pertama, apakah ada sesuatu yang saya lewatkan yang akan meniadakan masalah sepenuhnya? Atau, kedua, jika tidak, adakah cara lain (selain termasuk file eksternal) untuk memperhitungkan informasi konfigurasi yang berlebihan sehingga saya dapat memisahkan versi HTTP dan HTTPS dari konfigurasi server?
Solusi lainnya adalah menunjukkan ke hulu apakah permintaannya adalah HTTP atau HTTPS dan minta ia mengeluarkan redirect yang sesuai. Menambahkan ini di konfigurasi nginx akan mengatur header untuk upstream untuk diperiksa.
sumber