यहाँ मेरा संक्षिप्त 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अतिरेक को दूर करने के लिए एक निर्देश का उपयोग भी कर सकता हूं , लेकिन मैं वास्तव में बिना किसी निर्भरता के सिर्फ एक गोपनीय फाइल रखना चाहता हूं।
तो, सबसे पहले, क्या मुझे कुछ याद आ रहा है जो पूरी तरह से समस्या को नकार देगा? या, दूसरा, यदि नहीं, तो क्या कोई अन्य तरीका (बाहरी फाइल के अलावा) अतिरेक विन्यास सूचना को फैक्टर करने के लिए है ताकि मैं सर्वर कॉन्फ़िगरेशन के HTTP और HTTPS संस्करणों को अलग कर सकूं?