AWS托管Django站点配置SSL证书与HTTPS遇到访问登录问题求助
问题根因
- AWS负载均衡默认做SSL卸载:用户端到负载均衡走HTTPS协议,负载均衡转发到后端Django服务时走HTTP协议。你未配置Django识别代理传递的原始请求协议,Django会默认认为所有请求都是HTTP协议。
- 开启
SESSION_COOKIE_SECURE、CSRF_COOKIE_SECURE后,Django只会在HTTPS请求场景下下发安全cookie,识别到请求是HTTP时就不会下发对应的session、CSRF cookie,最终导致登录态无法建立、CSRF校验失败,出现登录页反复重载、CSRF报错的问题。 - 之前未加上述两个参数时可正常登录,但浏览器提示不安全,是因为此时站点默认走HTTP协议访问,没有HTTPS加密,浏览器会做不安全标记;手动添加https前缀访问时,Django仍会返回HTTP协议的资源或跳转,触发浏览器的非私有连接警告。
解决方案
按以下步骤修改Django的settings.py配置:
- 新增代理协议识别配置,让Django可以正确识别用户端的真实请求协议
# 信任负载均衡传递的X-Forwarded-Proto头,判断用户是否用HTTPS访问 SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https') # 允许读取负载均衡传递的原始请求域名 USE_X_FORWARDED_HOST = True # 按实际情况配置你的站点域名,不要用*提升安全性 ALLOWED_HOSTS = ["你的站点域名", ".你的站点域名"]
- 补充完整HTTPS安全配置,保留你之前新增的两个参数,添加强制HTTPS跳转配置
# 保留你之前新增的配置 SESSION_COOKIE_SECURE = True CSRF_COOKIE_SECURE = True # 自动将所有HTTP请求跳转到HTTPS,解决手动加HTTPS前缀的问题,必须和上面的SECURE_PROXY_SSL_HEADER配套使用,否则会出现无限跳转 SECURE_SSL_REDIRECT = True # 原有配置保留 SESSION_COOKIE_HTTPONLY = True CSRF_COOKIE_HTTPONLY = False
- 配置完成后重新部署你的Elastic Beanstalk应用,部署完成后清空浏览器缓存和已有Cookie再测试即可。
内容的提问来源于stack exchange,提问作者RobMcC
相关产品推荐
相关产品推荐

