You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:47:19