2017-01-05 6 views
6

के बजाय http है मेरा सर्वर Django + Gunicorn + nginx चलाता है।Django's HttpResponseRedirect https

मैंने http से https को रीडायरेक्ट करने के लिए एक SSL प्रमाणपत्र और कॉन्फ़िगर किया गया nginx जोड़ा है। जब एक https अनुरोध प्राप्त होता है, तो nginx इसे Gunicorn के रूप में http के रूप में पास करता है।

मेरा प्रोग्राम कभी-कभी HttpResponseRedirect देता है, और ब्राउज़र को रीडायरेक्ट प्रतिक्रिया मिलती है और http के रूप में पुनः अनुरोध करता है, इसलिए nginx https पर रीडायरेक्ट करता है।

मैं इससे कैसे बच सकता हूं? मैं सर्वर को कैसे कॉन्फ़िगर कर सकता हूं ताकि पहला पुनर्निर्देशन सीधे https URL पर इंगित हो?

+0

मैं वास्तव में एक ही बात करते हैं। Nginx बताएँ https सभी http अनुरोध को रीडायरेक्ट करने और इसे पी काम कर रहा है रीटी ठीक है। – Jbertrand

उत्तर

5

nginx विन्यास (location ब्लॉक के अंदर) में, यह निर्दिष्ट करें:

proxy_redirect off; 
proxy_set_header X-Forwarded-Proto $scheme; 

proxy_redirect nginx है कि, अगर बैकएंड एक HTTP रीडायरेक्ट देता है, यह है के रूप में छोड़ देना चाहिए बताता है। डिफ़ॉल्ट रूप से, nginx मानता है बैकएंड बेवकूफ है और स्मार्ट होने की कोशिश करता है; यदि बैकएंड एक HTTP रीडायरेक्ट कि "http://localhost:8000/somewhere पर पुन: निर्देशित" कहते हैं देता है, nginx http://yourowndomain.com/somewhere करने के लिए "कुछ इसी तरह के साथ यह बदल देता है। लेकिन Django बेवकूफ नहीं है (या इसे मूर्ख मत बनो करने के लिए विन्यस्त किया जा सकता)।

Django नहीं है पता है कि अनुरोध HTTPS या सादे HTTP के माध्यम से किया गया है; nginx जानता है कि, लेकिन बाद में यह अनुरोध Django बैकएंड को हमेशा सादा HTTP बनाता है। हम nginx को X-Forwarded-Proto HTTP शीर्षलेख के साथ इस जानकारी को पास करने के लिए कहते हैं, ताकि संबंधित Django कार्यक्षमता जैसे request.is_secure() काम करता है ठीक से। आप भी अपनी settings.py में SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https') स्थापित करने के लिए की आवश्यकता होगी।

+0

क्या मुझे nginx और django दोनों सेट करने की आवश्यकता है, या सिर्फ nginx सेट करें? – permike

+0

मुझे यकीन नहीं है कि आपका क्या मतलब है। आपकी सबसे अच्छी शर्त है कि डीजेंगो रिश्तेदार यूआरएल के रूप में रीडायरेक्शन लौटाए, जो "http: // डोमेन/लक्ष्य" की बजाय "/ target" है। –

+0

मेरा मतलब है कि मैंने nginx को जो कहा है उसके रूप में सेट करने के बाद, क्या मुझे django settings.py सेट करने की आवश्यकता है या यह केवल अन्य कार्यों के लिए एक सुधार है। आखिरकार, आप वास्तव में मदद करते हैं, धन्यवाद! – permike