ProgramingTip

Heroku https 사양을 만드는 방법은 무엇입니까?

bestdevel 2021. 1. 5. 21:17
반응형

Heroku https 사양을 만드는 방법은 무엇입니까?


Heroku (Cedar Stack)에 python / django 앱이 사용하여 https를 통해서만 액세스 할 수 있도록하고 싶습니다. "ssl piggyback"옵션을 활성화하는 것 https를 통해 강화할 수 있습니다.

그러나 http 액세스를 하하거나 https로 리디렉션하는 가장 좋은 방법은 무엇입니까?


@CraigKerstiens 및 @allanlei의 답변을 내가 테스트하고 작동하는지 확인한 결합합니다. Heroku는 요청이 ssl 일 때 HTTP_X_FORWARDED_PROTO를 https로 설정하고이를 사용하여 확인할 수 있습니다.

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)

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


@CraigKerstiens의 답변이 Heroku의 역방향 프록시는 "고정"되지 않은 경우 request.is_secure()항상 반환 False되는 것이 확실하지 않습니다. 라우팅 기억하면 HTTP 리디렉션 루프가 발생합니다.

gunicorn으로 Django를 실행하는 경우를 수행하는 또 다른 방법은 다음을 gunicorn의 구성에 추가하는 것입니다.

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

Procfile에서 이와 같이 실행하십시오.

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

gunicorn 년대를 secure-scheme-header, request.is_secure()제대로 돌아갑니다 TrueHTTPS 요청에. Gunicorn Config를 참조하십시오 .

이제 @CraigKerstiens의 미들웨어가 request.is_secure()앱에 대한 모든 호출을 포함하여 작동 합니다.

참고 : Django에는 동일한 구성 설정 SECURE_PROXY_SSL_HEADER이 있습니다.


애플리케이션에 어떤 프레임 워크를 사용하고 있습니까? 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)

플라스크를 사용하는 경우 매우 잘 작동합니다.

1) "pip install 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)

참조 URL : https://stackoverflow.com/questions/8436666/how-to-make-python-on-heroku-https-only

반응형