2011-12-08 17 views
47

मेरे पास हेरोकू (सीडर स्टैक) पर पायथन/डीजेंगो ऐप है और इसे केवल https पर पहुंचाना है। मैंने "एसएसएल पिगबैक" -ऑप्शन सक्षम किया है, और इसे https के माध्यम से कनेक्ट कर सकते हैं।केवल हेरोोक https पर पायथन कैसे बनाएं?

लेकिन http एक्सेस को अक्षम करने या https पर रीडायरेक्ट करने का सबसे अच्छा तरीका क्या है?

उत्तर

63

@ क्राइगकेर्स्टियंस और @allanlei से मैंने जो कुछ परीक्षण किया है, उसमें जवाब और काम के लिए सत्यापित किया है। Heroku https पर HTTP_X_FORWARDED_PROTO सेट किए जाने पर अनुरोध ssl है, और हम इस जांच करने के लिए उपयोग कर सकते हैं:

from django.conf import settings 
from django.http import HttpResponseRedirect 


class SSLMiddleware(object): 

    def process_request(self, request): 
     if not any([settings.DEBUG, request.is_secure(), request.META.get("HTTP_X_FORWARDED_PROTO", "") == 'https']): 
      url = request.build_absolute_uri(request.get_full_path()) 
      secure_url = url.replace("http://", "https://") 
      return HttpResponseRedirect(secure_url) 
+27

उत्तर अब एक [github पर ऐप] है (https://github.com/rdegges/django-sslify) –

+1

github डालने के लिए उपरोक्त ... धन्यवाद! बस मैं आज क्या देख रहा था। –

+3

एक साइड नोट के रूप में, यदि आपके पास DEBUG सही पर सेट है तो यह काम नहीं करता है। एक घंटे बिताए कि एक बाहर, तो उम्मीद है कि यह किसी को कुछ समय बचाता है। – Femi

6

आपके आवेदन के लिए आप किस ढांचे का उपयोग कर रहे हैं? आप Django उपयोग कर रहे हैं आप सरल उपयोग करने के लिए कुछ मिडलवेयर समान हो सकते हैं:

import re 

from django.conf import settings 
from django.core import urlresolvers 
from django.http import HttpResponse, HttpResponseRedirect 


class SSLMiddleware(object): 

    def process_request(self, request): 
     if not any([settings.DEBUG, request.is_secure()]): 
      url = request.build_absolute_uri(request.get_full_path()) 
      secure_url = url.replace("http://", "https://") 
      return HttpResponseRedirect(secure_url) 
+0

हाँ, मैं django का उपयोग कर रहा हूँ। उत्तर के लिए धन्यवाद: मैं इसे तब तक कोशिश करूंगा जब तक कि कुछ आसान नहीं होता (जैसे छुपे हुए हेरोकू विकल्प) दिखाई देता है .. – Kristian

+0

मुझे आपको जवाब देने के लिए एक छोटा सा झटका बनाना पड़ा, लेकिन मॉडरेटर ने मेरे संपादन को खारिज कर दिया। मैंने अपना खुद का उत्तर बनाया है जो आपके वर्तमान उत्तर में कभी-कभी समाप्त होने वाले रीडायरेक्ट के साथ समस्या को हल करता है।वैसे भी धन्यवाद, आपके योगदान के बिना मिडलवेयर समाधान का कभी सोचा नहीं होगा। – Kristian

+1

यह समाधान एक कभी-कभी समाप्त होने वाला रीडायरेक्ट लूप बनाता है। ऊपर मेरा जवाब देखें .. – Kristian

13

सुनिश्चित नहीं हैं कि @ CraigKerstiens यदि का जवाब यह है कि request.is_secure() हमेशा False लौटाता है यदि Heroku के रिवर्स प्रॉक्सी और नहीं के पीछे "निर्धारित" ध्यान देता है। अगर मुझे सही याद है, तो यह एक HTTP रीडायरेक्ट लूप का कारण बन जाएगा।

आप gunicorn साथ Django चला रहे हैं, एक और तरीका है करने के लिए इसे अपने Procfile

web: python manage.py run_gunicorn -b 0.0.0.0:$PORT -c config/gunicorn.conf 

में इस तरह से कुछ के साथ gunicorn करने के config निम्नलिखित

secure_scheme_headers = { 
    'X-FORWARDED-PROTO': 'https' 
} 

रन जोड़ने के लिए gunicorn की स्थापना करके है secure-scheme-header, request.is_secure() https अनुरोधों पर True ठीक से वापस करेगा। Gunicorn Config देखें।

अब @ क्रेगकेर्स्टियंस का मिडलवेयर आपके ऐप में request.is_secure() पर किसी भी कॉल सहित ठीक से काम करेगा।

नोट: Django भी एक ही कॉन्फ़िगरेशन सेटिंग SECURE_PROXY_SSL_HEADER पर कॉल करता है, लेकिन dev संस्करण में है।

+2

django SECURE_PROXY_SSL_HEADER सेटिंग अब मुख्यलाइन में उपलब्ध है (निश्चित रूप से 1.6 में, शायद पहले)। – Symmetric

4

आप बोतल का उपयोग कर रहे हैं, यह बहुत अच्छी तरह से काम करता है:

1) करो "flask- स्थापित पिप sslify "

(GitHub यहाँ है: https://github.com/kennethreitz/flask-sslify)

2) को शामिल करें निम्नलिखित लाइनों:

from flask_sslify import SSLify 
if 'DYNO' in os.environ: # only trigger SSLify if the app is running on Heroku 
    sslify = SSLify(app) 
+0

अगर हम ऐसा करते हैं .... क्या हमें अभी भी हेरोकू सामान करने की ज़रूरत है? क्षमा करें इस सामग्री के लिए थोड़ा नया – John

+0

हालांकि समस्या को फिर से देखें "flip-flopping" https://github.com/kennethreitz/flask-sslify/issues/3 – wodow

33

Django 1.8 के लिए कोर सपोर्ट होगा गैर HTTPS (django-secure से एकीकृत) रीडायरेक्ट:

SECURE_SSL_REDIRECT = True # [1] 
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https') 

आदेश में SECURE_SSL_REDIRECT के लिए नियंत्रित किया जा करने के लिए आप का उपयोग करने के SecurityMiddleware:

MIDDLEWARE = [ 
    ... 
    'django.middleware.security.SecurityMiddleware', 
] 

[1] https://docs.djangoproject.com/en/1.8/ref/settings/#secure-ssl-redirect

+0

क्या इसका मतलब यह है कि पीपी पैकेज sslify Django 1.8 के रूप में अप्रचलित है? – dfrankow

+0

@dfrankow django-sslify django-safe के समान लगता है, लेकिन आपको यह पुष्टि करनी होगी कि पैकेज लेखक – shangxiao

+0

@dfrankow No के साथ, आपको अभी भी Django 1.8 के साथ sslify की आवश्यकता है, यदि आप स्वचालित रूप से http से https तक उपयोगकर्ताओं को रीडायरेक्ट करना चाहते हैं । –

संबंधित मुद्दे