什么是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→循环
修复方法:
- 在CDN控制台将回源协议改为HTTPS(回源端口443)
- 或者关闭CDN的"协议跟随",强制使用HTTPS回源
- 在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→循环
修复方法:
- 确保443端口的SSL证书配置正确且有效
- 在调试阶段,先用HSTS max-age设为较小值(如300秒)测试
- 清除浏览器的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的核心就是一个字:循环。排查的关键在于追踪跳转链路,找出"谁跳给了谁"的死循环点。常见的排查顺序:
- 先用curl -Lv追踪跳转链路,定位循环位置
- 检查HTTP→HTTPS跳转配置是否只做单向
- 如果有CDN,检查回源协议是否匹配源站
- 检查多域名/server_name是否有互相跳转
- 检查location块和server块是否有重复重定向
- 检查后端应用是否也做了重定向
相关文章推荐
版权声明
本文仅代表个人观点。
本文系AI辅助作者原创,未经许可,转载请保留原文链接。

发表评论