部署在AWS的Laravel应用持续上报NotFoundHttpException如何解决
Laravel AWS部署频繁触发NotFoundHttpException错误解决方案
第一步:定位具体请求信息
当前报错仅返回404异常栈,未携带请求上下文,首先需要补全日志定位请求来源:
- 打开项目
app/Exceptions/Handler.php文件,在register方法中添加404异常的日志捕获逻辑:
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; public function register() { $this->reportable(function (NotFoundHttpException $e) { \Log::error('404请求详情', [ 'path' => request()->path(), 'method' => request()->method(), 'ip' => request()->ip(), 'user_agent' => request()->userAgent(), 'headers' => request()->headers->all() ]); }); }
- 部署修改后等待1-2分钟,查看AWS CloudWatch日志或服务器本地
storage/logs下的日志文件,即可获取触发异常的请求路径、请求方法、来源IP等信息。
常见对应解决方案(适配AWS部署场景)
原因1:AWS负载均衡健康检查触发
AWS ALB/NLB默认会定期发送健康检查请求,默认路径为/,如果应用根路径未配置路由,就会持续触发404。
解决步骤:
- 在路由文件中添加健康检查专用路由:
Route::get('/health', function () { return response()->json(['status' => 'ok'], 200); });
- 进入AWS负载均衡控制台,将健康检查路径修改为
/health,同时可以在异常上报规则中过滤该路径的404异常,避免推送Slack。
原因2:公网爬虫/端口扫描触发
公网环境下会有大量自动化爬虫扫描/.env、/phpmyadmin、/wp-admin等默认敏感路径,这类请求不属于业务请求,会频繁触发404。
解决步骤:
- 修改异常上报规则,仅上报业务前缀路径下的404异常,比如你的API接口都在
/api前缀下,可添加如下逻辑:
public function report(Exception $e) { if ($e instanceof NotFoundHttpException && !str_starts_with(request()->path(), 'api/')) { return; } parent::report($e); }
- 配置AWS WAF规则,直接拦截常见扫描路径的请求,从源头减少无效流量。
原因3:前端history模式路由触发
如果Vue项目使用history路由模式,且前后端部署在同一域名下,用户刷新页面时请求会发送到Laravel端,无对应路由就会触发404。
解决步骤:
在路由文件最底部添加兜底路由,所有非API路径请求返回前端入口文件:
Route::get('/{any}', function () { return view('index'); })->where('any', '.*');
注意该路由必须放在所有业务路由的最后,避免覆盖正常接口。
临时应急方案
如果需要快速停止Slack告警刷屏,可先在日志上报规则中直接屏蔽Symfony\Component\HttpKernel\Exception\NotFoundHttpException类型的异常,等定位到具体原因后再调整过滤规则。
内容的提问来源于stack exchange,提问作者rabie
相关产品推荐
相关产品推荐

