Route::miss() 是 ThinkPHP 8.0 中处理 404 的唯一可靠方式,需置于 route/app.php 末尾、开启 url_route_must、禁用通配路由、Nginx 禁用 error_page 404 并正确配置伪静态,且 404 视图中避免调用依赖路由的函数。

ThinkPHP 8.0 的 404 错误不是 PHP 异常,不会进入异常处理器,必须在路由层显式处理。靠改 ExceptionHandle、加 try-catch 或写控制器空方法都无效——这些方式只能覆盖极小部分场景,绝大多数 404 请求根本不会触发它们。
Route::miss() 是唯一可靠入口
TP8 的路由系统只有在所有已定义路由全部不匹配时,才会执行 Route::miss()。它必须放在 route/app.php 文件末尾,且位于所有 Route::get()、Route::post() 等之后:
// route/app.php 最后一行(确保无其他 Route::xxx 在它后面)
Route::miss(function () {
return response()->view('error/404', [], 404);
});必须开启路由强制模式
若 config/app.php 中 'url_route_must' => false(默认值),框架会退化为 PATH_INFO 解析,直接绕过 miss(),导致自定义 404 失效。请确认已设为:
'url_route_must' => true,
禁用通配路由
像 Route::any('[:all]', ...) 或 Route::rule('*', ...) 这类通配规则会吞掉所有未命中请求,让 miss() 永远不执行。上线前务必检查并删除。
Nginx 配置不能拦截 404
如果 Nginx 启用了 error_page 404,PHP 层的 Route::miss() 将完全不运行。请检查配置中是否包含类似语句,并注释或删除:
# error_page 404 /404.html; ← 删除或注释这一行
同时确认伪静态规则正确,推荐使用:
location / {
try_files $uri $uri/ /index.php?$query_string;
}并确保网站根目录指向 public/,不是项目根目录。
404 页面里别调用依赖路由的函数url()、action() 等函数在 miss() 场景下可能因路由未匹配而报错。如需链接,用绝对路径或手动传参:
立即学习“PHP免费学习笔记(深入)”;
// 在 miss() 闭包中传入当前 URL
Route::miss(function () {
$url = request()->fullUrl();
return response()->view('error/404', ['current_url' => $url], 404);
});视图中直接使用 $current_url 即可,避免运行时异常。
不复杂但容易忽略



















