如django文档所述,我设置了几个设置,但有两个问题:
SecurityMiddleware
不起作用SECURE_SSL_REDIRECT = True
网站无法访问SecurityMiddleware
应该设置Strict-Transport-Security: max-age=31536000; includeSubDomains
是responde标头,但是我通过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
没有严格的-运输-安全在其中
我使用nginx重定向,但我仍然不知道为什么SECURE_SSL_REDIRECT = True
导致网站访问,如果这个设置有其他影响?chrome显示ERR_TOO_MANY_REDIRECTS
django设置:
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
发布于 2019-06-13 05:36:39
我认为这两个问题,两个由同样的原因引起的问题。我使用nginx作为代理,并在nginx中将redirery HTTP设置为HTTPS,但是
代理可能“吞服”了这样一个事实,即请求是HTTPS,使用代理和Django之间的非HTTPS连接。
因此Django总是获得HTTP请求,同时将SECURE_SSL_REDIRECT = True
all http重定向到HTTPS,但所有这些HTTPS将再次成为代理和django之间的http,这就是导致无限重定向的原因。
如果SECURE_SSL_REDIRECT = False
django不会从nginx重定向http,而django只会在HTTPS响应头中设置strict-transport-security
,这就是为什么即使我的浏览器接收https响应(由nginx接收,没有django),响应头中没有strict-transport-security
,所以我更改了一些设置:
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
proxy_set_header X-Forwarded-Proto $scheme;
https://github.com/richardcornish/django-removewww/issues/1 HEADER https://stackoverflow.com/a/41488430/11350098
https://stackoverflow.com/questions/56572638
复制相似问题