部署后Django应用返回301重定向并触发NS_ERROR_REDIRECT_LOOP循环错误
部署后Django应用返回301重定向并触发NS_ERROR_REDIRECT_LOOP循环错误
看起来你的问题核心是非www域名跳转到www时,错误地把域名本身拼接到了URL路径里,最终出现https://www.ipantun.com/www.ipantun.com这种异常地址,进而触发重定向循环。结合你用了Nginx+Cloudflare的部署环境,我从几个常见排查点给你梳理解决方案:
1. 优先检查Nginx配置(最可能的问题根源)
这种路径拼接错误大多是Nginx的proxy_pass或重定向规则写错导致的:
错误示例(务必避免)
如果你的Nginx配置里,处理www域名的server块中,proxy_pass指向了公网域名而非本地Gunicorn服务,就会引发循环:
# 错误!这样会让Nginx把请求转发到ipantun.com,叠加Cloudflare的重定向就会陷入循环 location / { proxy_pass http://ipantun.com; }
正确的Nginx配置参考
你需要让Nginx直接转发请求到本地运行的Gunicorn服务,同时正确处理非www到www的重定向:
处理非www域名的server块(负责重定向)
server { listen 80; server_name ipantun.com; # 关键:用$request_uri保留原请求路径,避免错误拼接 return 301 https://www.ipantun.com$request_uri; }
处理www域名的server块(转发到Gunicorn)
server { listen 80; server_name www.ipantun.com; # 静态文件直接返回,不用走Gunicorn location /static/ { root /path/to/your/django/project; # 替换成你Django项目的根目录 expires 30d; } # 动态请求转发到Gunicorn location / { proxy_pass http://127.0.0.1:8000; # 如果用Unix套接字就写unix:/path/to/gunicorn.sock; # 这些Header很重要,让Django能正确识别请求来源 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; } }
配置修改后,重启Nginx生效:
sudo systemctl restart nginx
2. 检查Cloudflare的重定向规则
你设置的非www到www重定向,要确保规则没有错误拼接路径:
- 进入Cloudflare重定向规则页面,确认目标URL是
https://www.ipantun.com{uri}(保留原请求路径),而非写死成https://www.ipantun.com - 如果你已经在Nginx里配置了重定向,可以暂时关闭Cloudflare的规则,避免双重重定向冲突
3. 检查Django的配置
确保Django本身的配置不会加重定向循环:
- 在
settings.py里,把两个域名都加入ALLOWED_HOSTS:ALLOWED_HOSTS = ['ipantun.com', 'www.ipantun.com'] - 如果你开启了
SECURE_SSL_REDIRECT = True,由于用了Cloudflare作为反向代理,需要添加以下配置让Django识别HTTPS请求:
否则Django会认为请求是HTTP的,强制跳转到HTTPS,和Cloudflare的规则形成循环。SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
4. 验证步骤
- 直接访问VPS的IP+Gunicorn端口(比如
http://你的VPSIP:8000),确认Django应用本身能正常运行,排除应用内部的重定向问题 - 暂时关闭Cloudflare的重定向规则,只用Nginx的重定向测试,看是否还出现循环
- 用
curl -v ipantun.com查看重定向过程,能清晰看到每一步的跳转地址,帮助定位问题
备注:内容来源于stack exchange,提问作者Irfan Zainudin




