如何通过.htaccess或PHP捕获ERR_TOO_MANY_REDIRECTS并重定向到404页面?
关于捕获ERR_TOO_MANY_REDIRECTS并重定向到404的可行性分析
首先得明确一个关键点:ERR_TOO_MANY_REDIRECTS本质上是浏览器端抛出的错误——当浏览器检测到请求陷入循环重定向(一般超过20次左右),就会直接终止请求并显示这个错误。这时候服务器根本没机会收到后续的请求,所以没法直接“捕获”这个错误本身。
不过我们可以通过预防循环重定向,或者在服务器端提前检测到潜在的循环并终止,从而避免浏览器抛出这个错误,同时将请求导向404页面。下面分别用.htaccess和PHP给出具体方案:
一、用.htaccess预防循环并处理异常
.htaccess的重定向规则很容易不小心造成循环,所以核心是给重定向规则加条件,避免无限循环:
1. 给重定向规则加防循环条件
比如你原本的重定向规则是把旧页面导向新页面,就可以加条件排除目标页面本身,避免循环:
# 仅当请求的不是404页面时,才执行重定向(根据你的需求调整) RewriteCond %{REQUEST_URI} !^/404\.html$ # 仅当请求的不是目标页面时,才执行重定向 RewriteCond %{REQUEST_URI} !^/new-page$ RewriteRule ^old-page$ /new-page [R=301,L]
2. 设置自定义错误页(针对服务器端异常)
如果服务器端因为配置问题出现内部重定向循环,可能会返回500或508错误,你可以设置自定义错误页将这类错误导向404:
# 将500/508错误重定向到404页面 ErrorDocument 500 /404.html ErrorDocument 508 /404.html
二、用PHP提前检测重定向循环
PHP可以通过会话(Session)或Cookie记录重定向次数,当达到阈值时直接跳转到404页面:
session_start(); // 初始化重定向计数器 if (!isset($_SESSION['redirect_count'])) { $_SESSION['redirect_count'] = 0; } $_SESSION['redirect_count']++; // 设置阈值(比如5次,避免过多重定向) if ($_SESSION['redirect_count'] > 5) { // 重置计数器,避免影响后续请求 unset($_SESSION['redirect_count']); // 返回404状态码并显示404页面 header("HTTP/1.1 404 Not Found"); include('404.html'); // 替换成你的404文件路径 exit; } // 你的正常重定向逻辑 header("Location: /target-page.php"); exit;
注意:如果是跨子域名或不同路径的重定向,Session可能无法共享,这时候可以用Cookie来记录计数器(记得设置合适的Cookie作用域)。
总结
没法直接捕获浏览器端的ERR_TOO_MANY_REDIRECTS错误,因为此时服务器已经收不到请求了。但通过给重定向规则加防循环条件、在PHP中提前检测重定向次数,可以有效避免这个错误出现,同时在潜在循环发生时将请求导向404页面。
内容的提问来源于stack exchange,提问作者Mickey
相关产品推荐
相关产品推荐

