0

Nginx重定向循环ERR_TOO_MANY_REDIRECTS?7个常见原因与彻底解决方法

2026.05.28 | youres | 7次围观

什么是ERR_TOO_MANY_REDIRECTS错误?

当你在浏览器中访问网站时,如果页面不断跳转、始终无法加载,最终浏览器会弹出如下错误提示:

ERR_TOO_MANY_REDIRECTS
此网页包含重定向循环

这意味着你的请求在服务器之间被反复跳转,形成了一个死循环。浏览器的重定向次数有上限(Chrome通常是20次),一旦超过就强制终止请求并报错。

在Nginx环境下,这个问题非常常见,尤其是在配置HTTP跳转HTTPS、CDN回源、多域名绑定等场景中。本文总结了7个最常见的触发原因,逐一分析原因并给出修复方法。

原因一:HTTP和HTTPS的server块互相跳转

这是最常见的原因。你可能配置了两个server块,一个监听80端口(HTTP),一个监听443端口(HTTPS),但跳转逻辑写反了:

# 错误配置:HTTPS又跳回HTTP
server {
    listen 443 ssl;
    server_name example.com;
    return 301 http://$server_name$request_uri;  # 错误!
}

server {
    listen 80;
    server_name example.com;
    return 301 https://$server_name$request_uri;
}

访问流程:HTTP→跳转HTTPS→HTTPS又跳回HTTP→无限循环。

修复方法:确保只有HTTP server块跳转到HTTPS,HTTPS server块正常处理请求:

# 正确配置
server {
    listen 80;
    server_name example.com;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl;
    server_name example.com;
    # 正常处理请求,不要再跳转
    root /var/www/html;
    index index.html;
}

原因二:CDN回源协议与源站跳转冲突

如果你使用了Cloudflare、阿里云CDN等CDN服务,这是另一个高频触发场景:

  • 用户通过HTTPS访问CDN域名
  • CDN以HTTP协议回源(80端口)
  • 源站Nginx配置了HTTP→HTTPS跳转,返回301让CDN用HTTPS回源
  • CDN收到301后,让浏览器重新HTTPS访问→又以HTTP回源→又301→循环

修复方法

  1. 在CDN控制台将回源协议改为HTTPS(回源端口443)
  2. 或者关闭CDN的"协议跟随",强制使用HTTPS回源
  3. 在Nginx中添加判断,不对CDN回源请求做跳转
# 通过CDN回源时跳过HTTPS重定向
server {
    listen 80;
    server_name example.com;
    
    # 如果是CDN回源请求(通过特定header判断),直接处理不跳转
    if ($http_x_forwarded_proto = "https") {
        return 301 https://$server_name$request_uri;
    }
    # 如果已经是CDN HTTPS回源,正常处理
}

原因三:多个server_name互相重定向

当你有多个域名指向同一个站点时,容易写出互相跳转的配置:

# 域名A跳转到域名B
server {
    listen 443 ssl;
    server_name www.example.com;
    return 301 https://example.com$request_uri;
}

# 域名B又跳回域名A
server {
    listen 443 ssl;
    server_name example.com;
    return 301 https://www.example.com$request_uri;  # 错误!
}

修复方法:只做单向跳转,另一个server块直接处理请求:

server {
    listen 443 ssl;
    server_name www.example.com;
    return 301 https://example.com$request_uri;
}

server {
    listen 443 ssl;
    server_name example.com;
    # 正常处理请求
    root /var/www/html;
}

原因四:HSTS和HTTPS强制跳转叠加

当你同时配置了HSTS(Strict-Transport-Security)和HTTP→HTTPS跳转时,在某些场景下也会产生循环:

  • 浏览器收到HSTS头,缓存了"此域名必须HTTPS"
  • 如果Nginx的443端口没有正确配置SSL证书,浏览器会回退到HTTP
  • Nginx又301跳转到HTTPS→浏览器又收到HSTS→循环

修复方法

  1. 确保443端口的SSL证书配置正确且有效
  2. 在调试阶段,先用HSTS max-age设为较小值(如300秒)测试
  3. 清除浏览器的HSTS缓存后重新访问

原因五:Nginx和后端应用双重重定向

有些情况下,Nginx做了HTTPS跳转,后端应用(如PHP、Node.js、Java)又做了一次登录态校验跳转,形成嵌套循环:

  • Nginx: HTTP→HTTPS 301跳转
  • 后端应用: 检测到未登录→302跳转到登录页
  • 登录页又触发Nginx的HTTPS跳转规则→循环

修复方法

  • 检查后端应用的重定向逻辑,避免与Nginx规则冲突
  • 使用Nginx的rewrite_log开启调试日志,追踪跳转链路
server {
    listen 80;
    server_name example.com;
    rewrite_log on;
    return 301 https://$server_name$request_uri;
}

原因六:location块中的重定向与server块冲突

在server块级别做了HTTPS跳转,又在location块中写了额外的重定向规则,两者叠加导致循环:

server {
    listen 80;
    server_name example.com;
    
    location /admin {
        return 301 https://$server_name/admin;  # server块已经跳转了
    }
    
    location / {
        return 301 https://$server_name$request_uri;  # 又跳一次
    }
}

修复方法:统一在server块级别处理HTTPS跳转,location块只处理业务逻辑。

原因七:proxy_pass导致的重定向回环

当Nginx作为反向代理时,如果后端服务返回的重定向URL指向的是Nginx自身的地址(经过代理后的地址),就会形成回环:

server {
    listen 443 ssl;
    server_name example.com;
    location / {
        proxy_pass http://backend:8080;
        # 后端返回301到http://example.com/something
        # 浏览器访问HTTPS又被后端跳回HTTP→循环
    }
}

修复方法:使用proxy_redirect修正后端返回的重定向URL:

location / {
    proxy_pass http://backend:8080;
    proxy_redirect http://backend:8080/ https://$server_name/;
}

快速排查工具和命令

遇到ERR_TOO_MANY_REDIRECTS时,可以用以下工具快速定位问题:

1. curl -L 追踪跳转链路

curl -Lv http://example.com 2>&1 | grep -E "Location|HTTP/"

这会显示每一次跳转的目标URL和状态码,一眼就能看出循环发生在哪里。

2. Chrome开发者工具

  • 按F12打开开发者工具→Network面板
  • 勾选"Preserve log"保留日志
  • 访问页面,查看每次重定向的URL变化

3. Redirect Path浏览器插件

安装Chrome扩展Redirect Path,它会以可视化方式展示完整的重定向链路,包括301、302、JavaScript跳转等。

4. Nginx rewrite_log

# 在nginx.conf中开启rewrite日志
server {
    rewrite_log on;
    error_log /var/log/nginx/rewrite.log notice;
}

总结

ERR_TOO_MANY_REDIRECTS的核心就是一个字:循环。排查的关键在于追踪跳转链路,找出"谁跳给了谁"的死循环点。常见的排查顺序:

  1. 先用curl -Lv追踪跳转链路,定位循环位置
  2. 检查HTTP→HTTPS跳转配置是否只做单向
  3. 如果有CDN,检查回源协议是否匹配源站
  4. 检查多域名/server_name是否有互相跳转
  5. 检查location块和server块是否有重复重定向
  6. 检查后端应用是否也做了重定向

相关文章推荐

版权声明

本文仅代表个人观点。
本文系AI辅助作者原创,未经许可,转载请保留原文链接。

发表评论
883文章数 0评论数
作者其它文章