Webman中实现自定义404页面有五种方法:一、用Route::fallback动态响应AJAX或HTML;二、重写异常处理器render方法统一处理;三、Nginx/Apache服务器层配置error_page;四、利用Webman 1.5.23+的fallback $status参数精准区分404/405;五、通过web.config(IIS)或web.xml(Tomcat)声明式配置。

如果您在Webman项目中访问了不存在的路由,但默认返回的是简陋的404提示或空白响应,则说明未启用符合业务需求的自定义404页面。以下是实现该功能的多种方法:
一、使用Route::fallback动态响应
该方法通过全局兜底路由捕获所有未匹配请求,并根据请求类型(AJAX或页面)返回结构化JSON或HTML模板,无需修改异常处理器,适合轻量级定制。
1、在config/route.php文件中引入Request类和Route门面。
2、添加fallback回调函数,判断$request->expectsJson()是否为真。
3、若为AJAX请求,调用json(['code'=>404,'msg'=>'404 not found'])返回标准错误结构。
4、若为普通页面请求,调用view('404',['error'=>'Page not found'])->withStatus(404)渲染模板并显式设置HTTP状态码为404。
5、确保app/view/404.html文件存在且包含合法HTML结构及<!--?=htmlspecialchars($error)?--><!--?=htmlspecialchars($error)?-->变量输出。
二、重写全局异常处理器render方法
该方法接管所有未捕获异常(含404),通过扩展support\exception\Handler类,在render中识别404场景并差异化响应,适用于需统一处理多类错误的中大型项目。
1、新建app/exception/CustomExceptionHandler.php,继承support\exception\Handler。
2、重写render方法,在方法体内检查$e instanceof \support\exception\NotFoundException或$e->getCode() === 404。
3、若判定为404异常,对AJAX请求返回json(['code'=>404,'msg'=>'Resource not found'])。
4、对非AJAX请求,调用view('404',['exception'=>$e])->withStatus(404)。
5、在config/exception.php中将空键映射指向新类:return ['' => \app\exception\CustomExceptionHandler::class];。
三、配置HTTP服务器层404响应
该方法绕过PHP框架逻辑,直接由Nginx或Apache拦截404状态并返回静态HTML,性能最高且完全隔离业务代码,适用于CDN前置或高并发静态资源场景。
1、准备一个纯HTML文件public/404.html,内容不含PHP执行逻辑。
2、在Nginx配置中添加error_page 404 /404.html;指令。
Webman 2.2.0版本强化了 TCP/UDP 服务支持,优化路由组管理,并增强异步任务处理能力。结合协程与连接池技术,Webman 能轻松应对高并发场景,适用于网站、接口服务、即时通讯、物联网及游戏开发,兼具高性能、灵活扩展与稳定可靠,是多场景 PHP 服务开发的理想选择。
3、添加location = /404.html { internal; }防止用户直接访问该路径。
4、确保Webman应用返回真实404状态码(如通过fallback设置withStatus(404)),否则服务器无法触发error_page规则。
5、重启Nginx服务使配置生效。
四、结合Webman内置405/404状态识别机制
该方法利用Webman 1.5.23+版本Route::fallback支持的$status参数,精准区分404与405等不同错误类型,避免误判POST请求被当作404处理。
1、确认Webman版本不低于1.5.23,可通过composer show webman/framework验证。
2、在config/route.php中定义fallback闭包,接收Request $request和$status两个参数。
3、构建状态码映射数组:$map = [404 => '404 not found', 405 => '405 method not allowed'];。
4、使用response($map[$status], $status)构造响应,确保HTTP头中Status字段准确反映错误类型。
5、若需HTML模板支持,可基于$status值分支调用view("error/{$status}", [...])。
五、使用web.config或web.xml声明式配置(IIS/Tomcat)
该方法适用于Webman部署在IIS或传统Servlet容器时,通过容器原生错误页机制接管404,不依赖PHP代码执行,具备最高兼容性。
1、对于IIS7+,在项目根目录web.config的<system.webServer>节点下添加<httpErrors>节。
2、配置<error statusCode="404" path="/404.html" responseMode="ExecuteURL" />,注意使用相对路径。
3、若遇500.19错误,需在ApplicationHost.config中将allowAbsolutePathsWhenDelegated设为true。
4、对于Tomcat,在WEB-INF/web.xml中添加<error-page>块,指定<error-code>404</error-code>与<location>/404.html</location>。
5、确保/404.html位于Web容器可公开访问的路径下,且不被Webman路由规则覆盖。

















