Webman的404必须用Route::fallback()处理、500必须重写Handler::render();二者均需手动设置withStatus()确保状态码正确,且模板资源路径与Nginx静态配置需匹配,否则状态码错误或样式丢失。
Webman 的 404 和 500 页面不能靠 Nginx
配置“一劳永逸”,必须分层处理:404 必须走
,500 必须重写
;否则页面能显示,但状态码大概率是 200,SEO 和调试全失效。
Route::fallback() 是唯一可靠的 404 入口
Webman 不识别 Laravel 风格的
,也不响应 Nginx 的
—— 后者只在请求连
都没到达时才触发(比如直接访问
)。真正的 404 是“路由未命中”,属于 PHP 层逻辑,只能由
捕获。
必须把
放在
最末尾,否则前置路由会提前拦截
回调里要调用
区分 AJAX 请求,JSON 返回
,HTML 请求返回
模板路径写
即可,Webman 默认从
加载,别放错目录或加后缀
别在 fallback 里
新异常,这会让流程跳进 500 处理器,而不是继续走 404
500 页面必须重写 Handler::render()
500 错误本质是 PHP 运行崩溃(语法错误、内存超限、未捕获异常),Nginx 的
只在 PHP-FPM 成功返回 500 状态头时才生效;一旦 PHP 进程彻底挂掉,Nginx 只能吐原始错误文本。所以你得自己写
,并在
中注册:
方法里必须手动调用
,否则响应头仍是 200
模板中可用
变量,但生产环境别直接输出
,有信息泄露风险
如果用了中间件(如鉴权)抛出异常,确保它没提前
并吞掉异常,否则根本进不到这个
里别调用
或
辅助函数——异常发生时这些服务可能已不可用
静态资源加载失败会连累错误页样式
即使你写了
,404 页面本身也可能加载不了 CSS/JS —— 这不是 Webman 的问题,而是 Nginx/Apache 的静态资源
规则没配好。比如你的
引用了
,但 Nginx 没把该路径转发给 PHP,就会触发二次 404,导致样式丢失。
检查 Nginx 配置中
是否存在且权限正确
用
验证静态资源是否返回 200,而不是 404
错误页里的资源引用尽量用绝对路径(如
),避免相对路径解析歧义
别在
里写
或 JS 跳转,这会让状态码变成 302,搜索引擎当真
最容易被忽略的是:404 模板和 500 模板自身出错会二次崩溃。比如
里引用了不存在的
变量,或者
里调用了已销毁的服务,结果 fallback 到 Nginx 默认页,连自定义内容都看不到。
error_pageRoute::fallback()Handler::render()resources/views/errors/404.blade.phperror_page 404index.php/missing.cssRoute::fallback()Route::fallback()config/route.php$request->expectsJson()json(['code'=>404,'msg'=>'not found'])view('404')->withStatus(404)view('404')app/view/404.htmlthrowerror_page 500app/exception/Handler.phpconfig/exception.phpreturn ['' => \app\exception\Handler::class];render()->withStatus(500)$exception$exception->getTraceAsString()try/catchrender()app/view/500.htmlasset()url()withStatus(404)location404.html/css/app.csslocation ~* \.(css|js|png|jpg|gif|ico)$curl -I http://localhost/css/app.css/css/404.css404.htmlheader("Location: /")404.html$error500.html