रिवर्स प्रॉक्सी के रूप में उपयोग करने पर https से http तक पुनर्निर्देशित ट्रैफ़िक से nginx को रोकें


16

यहाँ मेरा संक्षिप्त 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 संस्करणों को अलग कर सकूं?

जवाबों:


29

खैर, मुझे थोड़ी प्रेरणा मिली और मैंने कोशिश की:

proxy_redirect http:// $scheme://;

जो चालबाजी करता दिख रहा है। यह अभी भी मेरे लिए हैकी लगता है, हालांकि, मैं अभी भी किसी भी मार्गदर्शन पर स्वागत करता हूं जो मैं गलत हो सकता है या उसी परिणाम को प्राप्त करने के लिए कम हैक करने के तरीके।


दरअसल, ऐसा करने का "आधिकारिक" तरीका लगता है ... wiki.nginx.org/SSL-Offloader
Irawan


यह काम नहीं करेगा यदि आपके स्थान पर कोई अनुगामी स्लैश नहीं है
HDave

भगवान कमबख्त लानत, सॉफ्टवेयर सिर्फ एक रिवर्स प्रॉक्सी के पीछे रहने की उम्मीद क्यों नहीं कर सकता (या कम से कम गॉडडैम सम्मान एक्स-फ़ॉर्वर्ड-स्कीम या जो कुछ भी हो? बटुआ +
एक्सल

5

अन्य समाधान अपस्ट्रीम को इंगित करना है कि क्या अनुरोध HTTP या HTTPS है और क्या यह रीडायरेक्ट के अनुसार जारी करता है। इसे nginx config में जोड़ना अपस्ट्रीम के निरीक्षण के लिए एक हेडर सेट करेगा।

proxy_set_header    X-Scheme $scheme;

आह, अब मैं देख रहा हूं कि आपके पास पहले से ही वह विन्यास है।
मॉर्गन

हां। लेकिन मैं मदद करने के प्रयास की सराहना करता हूं, फिर भी।
क्रिस प्रैट

4
यह कुछ त्रिकोणीय हैडर लगता है। मुझे लगता है कि X-Forwarded-Proto बेहतर है
vladkras
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.