Постоянное перенаправление http на https в Google App Engine. Гибкость с Django. - PullRequest
0 голосов
/ 26 августа 2018

Я работаю над проектом, который использует App Engine Google Cloud Platform в гибкой среде Python 3 с использованием Django, и я пытаюсь перенаправить все запросы от http до https для всех маршрутов, но такдалеко не удалось.Я могу получить доступ к сайту через https, но только если явно написано в адресной строке.

Я посмотрел этот пост: Как перенаправить навсегда `http://` и` www.`URL-адреса `https://`? , но не нашли ответ полезным.

Приложение работает правильно во всех смыслах, кроме перенаправления.Вот мой app.yaml файл:

# [START runtime]
runtime: python
env: flex
entrypoint: gunicorn -b :$PORT myproject.wsgi

runtime_config:
  python_version: 3
# [END runtime]

В myproject/settings.py У меня есть следующие переменные:

SECURE_SSL_REDIRECT = True
SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True
SECURE_PROXY_SSL_HEADER = ('HTTP-X-FORWARDED-PROTO', 'https')

На моей локальной машине, когда я установил SECURE_SSL_REDIRECT в True, Я был правильно перенаправлен на https, хотя SSL не поддерживается на localhost.В производственном процессе я все еще могу получить доступ к сайту, используя только http.

Есть ли что-то, что я пропускаю или делаю неправильно, чтобы не происходило перенаправление?

Ответы [ 4 ]

0 голосов
/ 30 мая 2019

У меня была похожая проблема, и я попытался изменить число как в app.yaml, так и в settings.py для пользовательского домена (с сертификатом ssl по умолчанию, предоставленным GAE).

Метод проб и ошибокЯ обнаружил, что в файле settings.py обновление разрешенных хостов для соответствующих доменов привело к желаемому результату:

ALLOWED_HOSTS = ['https://{your-project-name}.appspot.com','https://www.yourcustomdomain.com'] 

Обновление: я больше не уверен, что причиной является вышеперечисленное, так как при последующем развертывании вышеуказанное было отклоненои я получаю ошибку хостов.Однако перенаправление все еще на месте ...: (*

До этого изменения я мог вручную переключаться между http: // и https: // в адресной строке, теперь он перенаправляет автоматически.

0 голосов
/ 27 августа 2018

Убедитесь, что у вас включены SecurityMiddleware и CommonMiddleware, и присвойте Base_URL:

settings.py:

MIDDLEWARE_CLASSES = (
    ...
    'django.middleware.security.SecurityMiddleware'
    'django.middleware.common.CommonMiddleware',    
)

BASE_URL = 'https://www.example.com'

Или вы можете написать свое собственное промежуточное ПО:

MIDDLEWARE_CLASSES = (
    ...
    'core.my_middleware.ForceHttps',
)

BASE_URL = 'https://www.example.com'

my_middleware.py:

from django.http import HttpResponsePermanentRedirect

class ForceHttps(object):

    def process_request(self, request):

        if not (request.META.get('HTTPS') == 'on' and settings. BASE_URL == 'https://' + request.META.get('HTTP_HOST') ):
            return HttpResponsePermanentRedirect(settings. BASE_URL + request.META.get('PATH_INFO'))
        else:
            return None
0 голосов
/ 28 августа 2018

Проблема заключается в названии заголовка.При доступе к Django через сервер WSGI вы должны использовать заголовок X-Forwarded-Proto вместо HTTP_X_FORWARDED_PROTO.

См .: Почему django игнорирует HTTP_X_FORWARDED_PROTO с провода, но не в тестах?

0 голосов
/ 26 августа 2018

Настройка secure в app.yaml работает только для стандарта GAE, но не в Flexible.В app.yaml документах для Flexible этот ключ вообще не упоминается.

Возможно, вам придется сделать это на уровне приложения, проверив значение заголовка X-Forwarded-Proto.Будет установлено значение https, если запрос к вашему приложению поступил по HTTPS.Вы можете найти больше информации о предоставляемых средой заголовках в Гибкой среде в документации здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...