metinfo自定义错误页触发301/302重定向死循环的根本原因是error.php或404页面中存在隐式重定向逻辑,如未校验地调用header()或js跳转至自身,叠加服务器配置(如伪静态、error_page与try_files冲突)导致请求在/error.php、/404.html、/index.php间闭环跳转。

MetInfo 自定义错误页触发 301/302 重定向死循环
根本原因是 error.php 或自定义 404 页面里,存在对当前请求路径的隐式重定向逻辑,比如未加判断地调用 header("Location: ..."),或通过 JavaScript 跳转时未校验目标 URL 是否已为错误页自身。
常见诱因包括:
- 在
error.php中直接写header("Location: /404.html"),而 Nginx/Apache 又把所有 404 统一转发到error.php,形成闭环 - 前端 JS 检测到 404 后执行
window.location.href = "/404.html",但该地址仍被服务器判定为无效路径,再次进error.php - MetInfo 的
include/common.inc.php中启用了自动跳转逻辑(如检测$_SERVER['REDIRECT_STATUS'] === '404'后又触发一次跳转)
验证方法:打开浏览器 Network 面板,复现问题,观察响应状态码是否连续出现多个 301/302,且 Location 响应头指向的 URL 始终在 /404.html、/error.php、/index.php 之间打转。
MetInfo 的 error.php 被反复加载却无报错日志
这说明错误处理流程已进入“静默失败”阶段——PHP 没抛出致命错误,但页面逻辑不断自我调用。关键排查点是 MetInfo 的错误路由机制是否与 Web 服务器配置冲突。
MetInfo 默认靠 .htaccess(Apache)或 Nginx 的 error_page 指令接管 404,但若同时启用 PHP 的 set_error_handler 或 register_shutdown_function,就可能绕过 Web 服务器的错误页控制,导致 error.php 在非 404 场景下也被手动 include 进来。
检查以下位置:
-
.htaccess中是否有重复的ErrorDocument 404 /error.php,或被其他规则覆盖 - Nginx 配置中是否同时写了
error_page 404 /error.php和try_files $uri $uri/ /index.php?$query_string,后者可能让不存在的路径先落到index.php,再由 MetInfo 内部逻辑跳转到error.php,造成二次触发 -
error.php开头是否遗漏了http_response_code(404),导致浏览器或爬虫误判为 200,后续请求持续命中
自定义错误页中调用 MetInfo 核心函数引发递归崩溃
典型现象是页面白屏,Nginx error log 出现 recv() failed (104: Connection reset by peer) 或 PHP 错误日志显示 Maximum function nesting level of '256' reached。这是因为 error.php 试图加载 include/common.inc.php,而该文件内部又调用了数据库连接、模板解析等模块,这些模块在错误上下文中再次触发异常,最终回调到同一 error.php。
安全做法是:自定义错误页必须与主系统解耦。不要 include MetInfo 任何核心文件,只用原生 PHP 输出静态 HTML + 简单 CSS/JS。例如:
<?php http_response_code(404); ?><h1>Page Not Found</h1>
如果必须动态内容(如读取配置中的联系方式),只允许使用 file_get_contents() 读纯文本,禁止调用 Mysql、MetFile、template 等类或函数。
MetInfo 后台开启“伪静态”后错误页失效
伪静态规则会劫持所有非文件请求,强制走 index.php,此时 Web 服务器的 ErrorDocument 或 error_page 将完全不生效——所有 404 实际由 MetInfo 的路由层判定,而它默认返回的是首页或空白内容,而非你写的 error.php。
解决路径只有两条:
- 关闭伪静态,在
后台 > 系统设置 > SEO设置中将“URL伪静态”设为“否”,回归传统路径匹配 - 保留伪静态,但修改
index.php入口:在require 'include/common.inc.php';前加判断,若路由未匹配任何模块,直接include 'error.php'; exit;,跳过 MetInfo 完整加载流程
注意:error.php 文件本身不能放在 templates/ 下,否则会被 MetInfo 模板引擎尝试解析,增加死循环风险;应置于网站根目录,且确保 Web 服务器有直接访问权限。











