Django配置SECURE_SSL_REDIRECT=True后HTTPS重定向失败问题求助
问题根因
无限301重定向+超时问题的核心是反向代理和Django的HTTPS识别逻辑不匹配,以及可能的端口配置缺失,解决方案如下:
1. 配置反向代理转发正确的请求头
你部署时大概率用了Nginx/Apache做反向代理,处理HTTPS请求后转发HTTP请求到Django的8001端口,必须在代理配置中添加转发协议头的规则,以Nginx为例:
server { listen 443 ssl; server_name 你的实际域名; # 配置SSL证书路径 ssl_certificate 你的证书pem文件路径; ssl_certificate_key 你的证书key文件路径; location / { proxy_pass http://127.0.0.1:8001; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 关键配置:转发原请求的协议类型 proxy_set_header X-Forwarded-Proto $scheme; } } # 可选配置:80端口自动跳转HTTPS server { listen 80; server_name 你的实际域名; return 301 https://$host$request_uri; }
2. 补全Django settings.py配置
你已经配置了SECURE_PROXY_SSL_HEADER,还需要添加配置让Django信任代理转发的头:
# 加在settings.py末尾 USE_X_FORWARDED_HOST = True USE_X_FORWARDED_PORT = True # 生产环境请替换为你的实际域名,禁止用* ALLOWED_HOSTS = ["你的实际域名"]
额外注意:你当前的CORS配置存在冲突,CORS_ALLOW_ALL_ORIGINS=True时CORS_ORIGIN_WHITELIST不会生效,且http://*的写法不符合规范,生产环境建议关闭CORS_ALLOW_ALL_ORIGINS,仅添加实际需要的跨域地址。
3. 检查端口开放情况
确认CentOS服务器的防火墙、云服务商安全组已经放开443端口访问权限:
# 检查firewalld是否开放443端口 firewall-cmd --list-ports # 若没有则添加规则 firewall-cmd --add-port=443/tcp --permanent firewall-cmd --reload
4. 排查测试步骤
- 先清理浏览器缓存(301是永久重定向,会被浏览器长期缓存),或用无痕模式测试
- 本地测试Django的头识别是否正常:执行
curl -H "X-Forwarded-Proto: https" http://127.0.0.1:8001/admin/,如果返回200说明Django配置正常,问题出在反向代理 - 测试公网HTTPS连通性:执行
curl -v https://你的实际域名,排查证书、端口问题
生产环境不要直接用Django自带的runserver对外提供服务,建议使用Gunicorn/UWSGI作为应用服务容器,仅对内监听,由Nginx处理对外的HTTPS请求。
内容的提问来源于stack exchange,提问作者hitansh jain
相关产品推荐
相关产品推荐

