Nginx子域名重定向过多问题求助:Django+Gunicorn环境配置排查
解决子域名sub.example.com重定向过多的问题
咱们先从最常见的冲突点入手排查,大概率是Django的全局配置和子域名的HTTP需求不匹配导致的死循环。
问题根源分析
如果你的Django项目里设置了SECURE_SSL_REDIRECT = True,这会让Django强制所有请求跳转到HTTPS。但你的子域名sub.example.com是走HTTP的,没有配置SSL,这就形成了循环:Nginx把HTTP请求传给Django,Django返回301跳转到HTTPS,而Nginx的子域名配置又没有HTTPS监听,用户访问HTTPS会失败或被转回去,反复几次就触发了"too many redirects"。
另外,也可能是Nginx的子域名配置里不小心加了多余的重定向规则,或者协议头传递错误导致Django误判请求协议。
分步解决方案
1. 给Django的SSL重定向加子域名例外
不用全局关闭主域名的SSL强制跳转,只需在Django的settings.py里添加子域名的豁免规则:
SECURE_SSL_REDIRECT = True # 保持主域名的SSL强制跳转正常 SECURE_REDIRECT_EXEMPT = [ r'^sub\.example\.com/', # 匹配子域名的所有请求,跳过SSL重定向 ]
这个正则会精准匹配子域名的请求,让Django不对它做HTTPS强制跳转。
2. 修正Nginx的子域名配置
确保子域名的Nginx配置没有多余重定向,并且正确传递协议头给Django。示例配置如下:
server { listen 80; server_name sub.example.com; # 子域名的静态文件配置(如果需要的话) location /static/ { root /path/to/your/project/static_root; expires 30d; } location / { proxy_set_header Host $http_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; # 关键:传递实际的http协议给Django proxy_pass http://unix:/path/to/example/gunicorn/gunicorn.sock; } }
重点注意X-Forwarded-Proto这个头,如果传错成https,Django会误以为当前是HTTPS请求,进而触发不必要的跳转。
3. 验证配置并重启服务
- 先检查Nginx配置语法是否正确:
sudo nginx -t - 配置没问题的话,重启Nginx:
sudo systemctl restart nginx - 最后重启Gunicorn让Django的配置生效:
sudo systemctl restart gunicorn
额外排查点
如果上面的步骤还没解决问题,可以试试这些:
- 用浏览器隐私窗口访问子域名,排除旧重定向规则的缓存干扰
- 检查DNS解析,确保
sub.example.com正确指向服务器IP - 确认服务器上没有其他反向代理、防火墙规则干扰请求
内容的提问来源于stack exchange,提问作者darkpool
相关产品推荐
相关产品推荐

