404属客户端错误,表示请求路径不存在或未匹配到后端路由;500属服务端错误,表示后端处理请求时发生未捕获异常。二者责任方不同,排查方向应分别聚焦路径配置与后端执行环境。

遇到 REST 接口返回 404 或 500,别急着改代码——先分清是“路径没找对”还是“服务崩了”。这两个状态码责任归属完全不同:404 属于客户端错误(请求发错了地方),500 是服务端错误(后端出问题了)。定位准了,排查就快了一半。
404 Not Found:先确认请求有没有真正到达后端
很多 404 其实压根没进后端框架,被 Web 服务器或网关拦在了外面。
- 用浏览器 DevTools 的 Network 面板,点开报红的请求,看 Request URL 是否拼写正确(注意大小写、斜杠、版本前缀如 /v1/api/users)
- 直接访问带 index.php 的完整路径测试,比如 /index.php/api/users。如果能通,说明是重写规则(rewrite)或 urlManager 配置问题;如果也不通,问题可能出在入口脚本、PHP-FPM、Nginx fastcgi 配置或权限上
- 检查 Nginx/Apache 访问日志,确认该请求是否出现在日志里。没出现=请求未抵达 Web 服务器;出现了但返回 404=后端路由没匹配上
- 如果是框架(如 Yii、Spring Boot、Express),确认对应 Controller/Route 是否已注册,路径规则是否覆盖了你请求的 URI(例如正则中 \w+ 不匹配中划线,得写成 [\w\-]+)
500 Internal Server Error:重点查后端执行过程是否崩溃
500 意味着请求进了后端,但在处理过程中抛出了未捕获异常。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 第一反应是看后端日志(如 Spring Boot 的 console 输出、logback 文件,或 PHP 的 error_log)。空指针、数据库连接失败、JSON 解析异常、第三方接口超时等,基本都会在这里留下堆栈
- 检查是否启用了全局异常处理器(如 Spring 的 @ControllerAdvice、Yii 的 errorHandler)。没有的话,异常会被吞掉,只留个空白响应或默认 HTML 错误页
- 如果是 Nginx 反向代理场景,还要看 Nginx 的 error.log。常见情况包括:上游服务宕机、proxy_read_timeout 太短导致请求被主动中断、后端返回非法响应体(如 header 已发送又输出内容)
- 临时加一行日志到接口入口(比如 Controller 方法第一行),确认是否执行到了那里。没执行=路由或中间件拦截了;执行了但没返回=卡在某步逻辑里
快速区分前后端责任的三步法
不用来回扯皮,靠 Network 面板就能初步定责:
- 看 Status 列:明确是 404 还是 500
- 看 Response 内容:404 响应体通常含 “Not Found” 字样,500 多为 “Internal Server Error” 或堆栈片段(开发环境)
- 看 Timing 标签页:如果 Stalled 或 Waiting 时间很长,可能是 DNS、连接池耗尽或网关转发慢;如果 Content Download 突然中断,可能是后端崩溃或超时
避免踩坑的几个关键点
有些细节不注意,排查会绕大弯:
- Nginx 默认只允许 GET/HEAD,用 POST/PUT/DELETE 时,要检查 limit_except 或 if ($request_method) 配置是否拦住了请求
- Spring Boot 项目若想让 404 走自定义异常处理器,必须配置 spring.mvc.throw-exception-if-no-handler-found=true,否则 404 会走默认页面,不触发 @ExceptionHandler
- 前端调用时,确保传参格式(Content-Type)、鉴权头(Authorization)、跨域 Cookie 设置都符合后端要求。一个错的 Token 或缺失的 Accept 头,也可能导致后端提前拒绝并返回 404(尤其某些网关策略)










