นี่คือ nginx vhost ตัวย่อของฉัน conf:
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;
}
}
เซิร์ฟเวอร์เดียวกันต้องให้บริการทั้ง HTTP และ HTTPS อย่างไรก็ตามเมื่ออัปสตรีมปัญหาการเปลี่ยนเส้นทาง (ตัวอย่างเช่นหลังจากประมวลผลแบบฟอร์ม) คำขอ HTTPS ทั้งหมดจะถูกเปลี่ยนเส้นทางไปยัง HTTP สิ่งเดียวที่ฉันได้พบที่จะแก้ไขปัญหานี้คือการเปลี่ยนแปลงproxy_redirect
ต่อไปนี้:
proxy_redirect http:// https://;
ใช้งานได้อย่างยอดเยี่ยมสำหรับคำขอที่มาจาก HTTPS แต่หากมีการออกการเปลี่ยนเส้นทางผ่าน HTTP ก็จะเปลี่ยนเส้นทางนั้นไปยัง HTTPS ซึ่งเป็นปัญหา
ฉันหมดความพยายาม:
if ($scheme = 'https') {
proxy_redirect http:// https://;
}
แต่ nginx บ่นproxy_redirect
ว่าไม่ได้รับอนุญาตที่นี่
ตัวเลือกอื่นที่ฉันคิดได้คือการกำหนดเซิร์ฟเวอร์สองเครื่องแยกกันและตั้งค่าไว้proxy_redirect
ใน SSL เดียว แต่จากนั้นฉันจะทำซ้ำส่วนที่เหลือของความเชื่อมั่น (มีserver
คำสั่งมากมายที่ฉันไม่ได้ทำเพื่อความเรียบง่าย) ฉันรู้ว่าฉันยังสามารถใช้include
คำสั่งเพื่อแยกแยะความซ้ำซ้อน แต่ฉันต้องการเก็บไฟล์ conf เพียงไฟล์เดียวโดยไม่มีการอ้างอิงใด ๆ
ดังนั้นก่อนอื่นมีบางสิ่งที่ฉันขาดซึ่งจะลบล้างปัญหาโดยสิ้นเชิงหรือไม่? หรืออย่างที่สองถ้าไม่มีมีวิธีอื่น (นอกเหนือจากการรวมไฟล์ภายนอก) เพื่อแยกแยะข้อมูลการกำหนดค่าที่ซ้ำซ้อนเพื่อให้ฉันสามารถแยกเวอร์ชัน HTTP และ HTTPS ของการกำหนดค่าเซิร์ฟเวอร์ออกได้หรือไม่