Я установил несколько настроек, как сказано в документе django, но у меня есть две проблемы:
SecurityMiddleware
не получилосьSECURE_SSL_REDIRECT = True
сайт будет недоступен для посещенияSecurityMiddleware
предполагается установить Strict-Transport-Security: max-age=31536000; includeSubDomains
заголовок ответа, но я проверяю chrome F12, заголовок ответа выглядит так:
Connection: keep-alive
Content-Encoding: gzip
Content-Type: text/html; charset=utf-8
Date: Thu, 13 Jun 2019 02:18:17 GMT
Server: openresty/1.15.8.1
Set-Cookie: uid=e59e2b54f7d64a6799b0f160dc80fae6; expires=Sun, 10 Jun 2029 02:18:17 GMT; HttpOnly; Max-Age=315360000; Path=/
Transfer-Encoding: chunked
X-Frame-Options: SAMEORIGIN
в нем нет Strict-Transport-Security
я использую nginx для перенаправления, но мне все еще интересно, почему SECURE_SSL_REDIRECT = True
не удается посетить веб-сайт, и влияет ли этот параметр на другое?
хром показывает ERR_TOO_MANY_REDIRECTS
настройки Джанго:
MIDDLEWARE = [
# 'django.middleware.cache.UpdateCacheMiddleware',
'blog.middleware.user_id.UserIDMiddleware',
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
ALLOWED_HOSTS = ['www.xxxxxx.club']
#SECURE_SSL_REDIRECT = True
CSRF_COOKIE_SECURE = True
SESSION_COOKIE_SECURE = True
SECURE_HSTS_SECONDS = 31536000
SECURE_HSTS_INCLUDE_SUBDOMAINS = True
SECURE_HSTS_PRELOAD = True
Я понимаю, что это две проблемы, две проблемы, вызванные одной и той же причиной. я использую nginx в качестве прокси и устанавливаю переадресацию HTTP на HTTPS в nginx, но
the proxy may be “swallowing” the fact that a request is HTTPS, using a non-HTTPS connection between the proxy and Django
поэтому django всегда получает HTTP-запрос при установке SECURE_SSL_REDIRECT = True
всех перенаправлений http на HTTPS, но все эти HTTPS снова станут http между прокси и Django, что является причиной бесконечного перенаправления.
если SECURE_SSL_REDIRECT = False
django не будет перенаправлять http из nginx, а django установит только strict-transport-security
в заголовке ответа HTTPS, то почему, хотя мой браузер получает ответ https (от nginx, не django), нет strict-transport-security
в заголовке ответа
поэтому я изменил некоторые настройки:
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
в настройках джангоproxy_set_header X-Forwarded-Proto $scheme;
в месте внутри 443 порта nginx confhttps://github.com/richardcornish/django-removewww/issues/1https://docs.djangoproject.com/en/2.1/ref/settings/#std:setting-SECURE_PROXY_SSL_HEADERhttps://stackoverflow.com/a/41488430/11350098
Я возглавляю бесконечные перенаправления на daphne (слишком много перенаправлений). Установка SECURE_SSL_REDIRECT = True была причиной возникновения проблемы с nginx. Но вместо этого я установил SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https'), как вы предложили, и теперь это работает. Спасибо! Отличное решение.
Вы не устанавливаете файлы cookie для защиты?