2012-07-20 18 views
9

मैं एसएसएल का उपयोग कर स्थानीय रूप से अपने Django ऐप का परीक्षण करने की कोशिश कर रहा हूं। मुझे @login_required सजावट के साथ एक दृश्य है। तो जब मैंने /locker मारा, तो मुझे /locker/login?next=/locker पर रीडायरेक्ट किया गया। यह http के साथ ठीक काम करता है।Django @login_ https छोड़कर https

बहरहाल, जब भी मैं https का उपयोग, रीडायरेक्ट किसी भी तरह सुरक्षित कनेक्शन चला जाता है, तो मैं जैसे https://cumulus.dev/locker -> http://cumulus.dev/locker/login?next=/locker

कुछ अगर मैं https://cumulus.dev/locker/login?next=locker पर सीधे जाने के पेज किसी सुरक्षित कनेक्शन पर ठीक खोलता मिलता है। लेकिन एक बार जब मैं उपयोगकर्ता नाम और पासवर्ड दर्ज करता हूं, तो मैं http://cumulus.dev/locker पर वापस जाता हूं।

मैं SSL को संभालने के लिए Nginx का उपयोग कर रहा हूं, जो तब runserver से बात करता है। मेरे nginx config है

upstream app_server_djangoapp { 
server localhost:8000 fail_timeout=0; 
} 

server { 
listen 80; 
server_name cumulus.dev; 

access_log /var/log/nginx/cumulus-dev-access.log; 
error_log /var/log/nginx/cumulus-dev-error.log info; 

keepalive_timeout 5; 

# path for static files 
root /home/gaurav/www/Cumulus/cumulus_lightbox/static; 

location/{ 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    proxy_set_header Host $http_host; 
    proxy_redirect off; 

    if (!-f $request_filename) { 
     proxy_pass http://app_server_djangoapp; 
     break; 
    } 
} 
} 

server { 
listen 443; 
server_name cumulus.dev; 

ssl on; 
ssl_certificate /etc/ssl/cacert-cumulus.pem; 
ssl_certificate_key /etc/ssl/privkey.pem; 

access_log /var/log/nginx/cumulus-dev-access.log; 
error_log /var/log/nginx/cumulus-dev-error.log info; 

keepalive_timeout 5; 

# path for static files 
root /home/gaurav/www/Cumulus/cumulus_lightbox/static; 

location/{ 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    proxy_set_header X-Forwarded-Ssl on; 
    proxy_set_header Host $http_host; 
    proxy_redirect off; 

    if (!-f $request_filename) { 
     proxy_pass http://app_server_djangoapp; 
     break; 
    } 
} 
} 
+0

मैं कहना है, "ओह, बस अपने' settings.py' फ़ाइल में 'LOGIN_URL' बदल" जा रहा था ... लेकिन मुझे लगता है कि कोशिश की और यह काम नहीं करता है। अच्छा प्रश्न। –

उत्तर

4

तो वह हमेशा का उपयोग करेगा (जैसे रीडायरेक्ट के रूप में) संपूर्ण URL के निर्माण के लिए, जब तक आप इसे कॉन्फ़िगर कैसे देखने के लिए कि प्रॉक्सी अनुरोध था Django केवल प्रॉक्सी के पीछे सादा HTTP पर चल रहा है, मूल रूप से HTTPS पर बनाया गया।

Django 1.4 के रूप में, आप SECURE_PROXY_SSL_HEADER सेटिंग का उपयोग करके ऐसा कर सकते हैं। जब Django कॉन्फ़िगर किए गए हेडर को देखता है, तो यह अनुरोध HTTP के बजाय HTTPS के रूप में करेगा: request.is_secure() सत्य वापस आ जाएगा, https:// यूआरएल उत्पन्न होंगे, और इसी तरह।

हालांकि, दस्तावेज़ में सुरक्षा चेतावनियों को नोट करें: यह सुनिश्चित करना चाहिए कि प्रॉक्सी HTTP और HTTPS दोनों आने वाले क्लाइंट अनुरोधों से विश्वसनीय शीर्षलेख को प्रतिस्थापित या स्ट्रिप्स करता है। उपरोक्त आपकी nginx कॉन्फ़िगरेशन X-Forwarded-Ssl के साथ ऐसा नहीं करता है, जिससे इसे धोखा दे सकता है।

इसके लिए एक पारंपरिक समाधान X-Forwarded-Protocolhttp या https को उचित रूप से, प्रत्येक प्रॉक्सी कॉन्फ़िगरेशन में सेट करना है। उसके बाद, आप Django कॉन्फ़िगर कर सकते हैं यह देखने के लिए उपयोग कर रहा:

SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTOCOL', 'https') 
+0

धन्यवाद! :) मैंने इसे गनिकोर्न का उपयोग करके काम किया है, लेकिन मुझे हेडर सेट करना याद है लेकिन हेडर सेटिंग का उपयोग नहीं कर सका क्योंकि मैं अभी भी 1.3 पर हूं! –

+0

@ गौरववधानिया क्या आपको याद है कि आपने इसे कैसे समझा? मैं जवाब देना चाहता हूं http://stackoverflow.com/questions/29737089/how-do-i-use-a-login-redirect-with-https-in-django – YPCrumble