网页打不开时看到 404,服务器出问题时遇到 502,网站改版后又经常要处理 301。HTTP 状态码几乎贯穿网站建设、SEO、服务器运维和接口开发的整个过程。

不过,状态码并不能简单理解成“200 正常、其他都是错误”。301 和 302 都是重定向,但用途不同;304 看起来属于 3xx,却不是让用户跳转到另一个网址;404 和 410 都代表资源不可用,含义也不完全一样。

想判断一个网页到底发生了什么,先理解状态码往往比只看浏览器页面更有效。

网页状态码怎么看?从 2xx、3xx 到 4xx、5xx 一次讲清楚

HTTP 状态码是怎么回事

浏览器访问网页时,会向服务器发送 HTTP 请求。服务器处理请求后,除了返回 HTML、图片、JSON 等内容,还会返回一个三位数的状态码,用来说明这次请求的处理结果。

状态码按照第一位数字,大致分为五类:

范围含义常见状态码
1xx信息性响应,请求仍在处理100、103
2xx请求已经成功处理200、201、204、206
3xx重定向或缓存相关处理301、302、304、307、308
4xx请求本身存在问题或访问受限400、401、403、404、410、429
5xx服务器处理请求时出现异常500、502、503、504

对于普通网站运营,真正高频的主要集中在 2xx 到 5xx。1xx 多出现在协议交互过程中,一般不会直接成为网页故障排查的重点。

2xx:请求已经成功处理

200 OK

200 是网站中最常见的成功状态码,表示服务器已经正常处理请求并返回响应。

一个可以正常访问并需要被搜索引擎收录的普通网页,通常应该返回 200。

但需要注意,返回 200 并不等于页面内容一定正常。例如一个实际上不存在的 URL,服务器却返回“页面不存在”的提示内容,同时 HTTP 状态仍然是 200,就可能形成所谓的软 404 问题。

201 Created

201 表示请求成功,并创建了新的资源。它更多见于 API,例如提交表单后创建一条记录、通过接口新建用户或文章。

普通网页浏览过程中不算常见。

204 No Content

204 表示请求已经成功处理,但服务器没有需要返回的响应正文。

这种状态常用于接口操作,例如保存设置、删除数据或提交某个操作后,不需要重新返回页面内容。

206 Partial Content

206 表示服务器只返回了资源的一部分,通常与 Range 请求有关。

在线视频播放、音频拖动、大文件分段下载等场景经常会使用这种机制。看到 206 不应该直接判断为请求异常。

3xx:跳转和缓存最容易混淆

301 Moved Permanently

301 表示资源已经永久移动到新的 URL。

网站更换域名、URL 结构调整、HTTP 跳转 HTTPS、统一 www 与非 www 地址时,经常会使用 301。

对于 SEO 来说,旧 URL 确定不再使用,并且存在明确的新地址时,301 通常是更合适的处理方式。

例如:

https://example.com/old-page
→ 301
https://example.com/new-page

需要避免的是无意义的多层跳转:

A → 301 → B → 301 → C → 301 → D

这种重定向链会增加请求次数,也会让抓取和故障排查变得复杂。能够直接从 A 跳到最终地址 D 时,没有必要保留中间环节。

302 Found

302 通常用于临时重定向。当前资源暂时通过另一个 URL 提供,但原地址未来仍可能继续使用。

例如临时活动页面、短时间维护跳转或者某些登录流程,都可能使用 302。

301 和 302 最核心的区别不是“能不能跳转”,而是向客户端和搜索引擎表达的意图不同:一个偏向永久变更,一个偏向临时安排。

304 Not Modified

304 很容易被误认为普通重定向,因为它位于 3xx 范围,实际上它主要与浏览器缓存有关。

浏览器已经保存过某个资源,再次请求时可能带上缓存验证信息。如果服务器确认资源没有发生变化,就可以返回 304,告诉浏览器继续使用本地缓存,而不必重新传输完整内容。

因此,开发者工具 Network 面板中出现 304,通常并不意味着网页发生了地址跳转。

307 与 308

307 Temporary Redirect 表示临时重定向,308 Permanent Redirect 表示永久重定向。

它们与 302、301 的一个重要区别,是对原请求方法和请求正文的保留语义更加明确。例如原请求是 POST 时,307 和 308 要求客户端在跳转后继续保持相应的请求方法。

普通网页跳转中 301、302 仍很常见,而涉及 API、表单提交等场景时,307 和 308 的差别更值得关注。

4xx:问题通常出在请求这一侧

400 Bad Request

400 表示服务器认为收到的请求有问题,无法正常处理。

常见原因包括请求参数格式错误、请求语法异常、Cookie 或 Header 出现问题等。它通常不是“服务器完全宕机”,而是服务器无法理解或接受当前请求。

401 Unauthorized

401 通常表示当前请求没有通过身份认证,需要提供有效的认证信息。

它经常出现在 API、后台系统或需要登录认证的资源中。

401 和 403 经常被混淆。简单理解:

  • 401:身份没有通过认证,需要先证明“你是谁”。

  • 403:服务器理解请求,但拒绝你访问。

403 Forbidden

403 表示服务器收到并理解了请求,但拒绝提供资源。

常见原因包括文件权限错误、服务器访问控制、IP 限制、防火墙或安全规则拦截,以及目录禁止访问等。

网站出现 403 时,不应该直接按“页面不存在”处理,因为资源可能真实存在,只是当前请求没有访问权限。

404 Not Found

404 是网站中最常见的错误状态之一,表示服务器没有找到与当前 URL 对应的资源。

常见情况包括:

  • 页面已经删除。

  • URL 输入错误。

  • 网站改版后地址发生变化。

  • 内部链接指向了错误地址。

  • 路由或伪静态规则配置错误。

少量正常的 404 并不可怕。真正需要处理的是大量内部死链、重要页面误返回 404,或者本应删除的页面却仍然返回 200。

405 Method Not Allowed

405 表示目标资源存在,但不允许当前使用的 HTTP 请求方法。

例如某个接口只允许 POST,请求时却使用 GET,就可能返回 405。这种状态在 API 和表单接口调试中比较常见。

408 Request Timeout

408 表示服务器等待客户端完成请求的时间过长,最终终止了请求。

它可能与网络不稳定、请求发送速度过慢或服务器超时策略有关。

410 Gone

410 与 404 都意味着当前无法获得资源,但 410 的语义更明确:这个资源已经被移除,并且服务器知道它不再提供。

对于明确永久删除、没有替代页面的内容,可以考虑返回 410。普通“不知道有没有这个资源”的情况仍更常见地使用 404。

429 Too Many Requests

429 表示客户端在一定时间内发送了过多请求,触发了服务器限流。

常见于:

  • API 调用频率超过限制。

  • 爬虫抓取速度过快。

  • 登录或验证码接口触发安全限制。

  • CDN、WAF 或反爬虫系统限制访问。

如果搜索引擎爬虫频繁遇到 429,也需要检查服务器容量和限流策略,避免把正常抓取误判成恶意访问。

5xx:重点检查服务器和上游

500 Internal Server Error

500 是比较宽泛的服务器内部错误,表示服务器在处理请求时发生了异常,但没有提供更具体的状态。

常见原因可能包括程序报错、数据库异常、配置错误、权限问题或运行环境故障。

看到 500 后,仅凭状态码通常无法直接确定原因,还需要查看应用日志、Web 服务器日志和相关错误信息。

501 Not Implemented

501 表示服务器不支持完成当前请求所需要的功能或请求方法。

它在普通网页访问中并不常见,更多与服务器实现能力或特殊协议请求有关。

502 Bad Gateway

502 在使用 Nginx、反向代理、CDN 或网关的网站中非常常见。

它通常意味着当前服务器作为网关或代理向上游服务器请求数据时,收到了无效响应。

例如:

浏览器
  ↓
Nginx / CDN
  ↓
PHP、Node.js、Java 或其他后端服务

如果前面的 Nginx 正常运行,但后端程序崩溃、端口没有监听或连接异常,就可能出现 502。

503 Service Unavailable

503 表示服务器暂时无法处理请求。

常见情况包括服务器过载、应用正在维护、服务暂时下线或后端资源不足。

计划性维护时,503 往往比直接返回 404 或错误地返回 200 更符合实际状态。服务器还可以配合 Retry-After 响应头,提示客户端何时可以再次尝试。

504 Gateway Timeout

504 与 502 都常见于反向代理架构,但两者问题不同。

502 更接近“上游返回了无效响应”,504 则是“等待上游响应太久,最终超时”。

例如数据库查询非常慢、PHP 程序执行时间过长、后端 API 长时间没有响应,都可能最终表现为 504。

几个状态码怎么快速区分

状态码核心含义常见处理方向
200请求成功确认页面内容是否也真实正常
301永久重定向检查目标地址和重定向链
302临时重定向确认是否真的只是临时跳转
304缓存资源未修改通常无需按错误处理
401身份认证未通过检查登录或认证信息
403服务器拒绝访问检查权限、安全规则和访问控制
404资源未找到检查 URL、死链和页面是否删除
410资源明确永久移除确认页面是否确实不再提供
429请求过多检查限流、爬虫和访问频率
500服务器内部异常查看程序和服务器日志
502网关收到无效上游响应检查后端服务和反向代理
503服务暂时不可用检查过载、维护和服务状态
504等待上游响应超时检查后端执行时间和网络连接

别只看浏览器显示的错误页

排查网站问题时,一个容易犯的错误是只看页面上写了什么。

页面显示“404 页面不存在”,服务器未必真的返回 404;页面正常显示,也不代表中间没有经过多次 301 和 302;CDN 显示一张自定义错误页,真实 HTTP 状态可能是 502、503 或其他代码。

更可靠的方法是查看真实 HTTP 响应。可以使用浏览器开发者工具的 Network 面板,也可以通过 curl 检查:

curl -I https://example.com/

需要跟踪完整重定向过程时,可以使用:

curl -I -L https://example.com/

对于 SEO 排查,还可以结合搜索引擎站长工具、网站爬虫和服务器日志,判断某个状态码是偶发问题,还是已经大范围影响网站。

看到状态码后先判断哪一层出错

状态码真正有用的地方,不是记住一串数字,而是帮助缩小问题范围。

200、204、206 通常说明服务器已经接受并处理请求;301、302、307、308 要继续检查跳转目的和使用场景;401、403、404、429 更应该从请求、权限、资源和访问策略入手;500 到 504 则需要把注意力转向应用服务器、反向代理、数据库和上游服务。

同一个“网页打不开”,背后的原因可能完全不同。先确认真实状态码,再结合响应头、重定向链和服务器日志继续排查,通常比反复刷新页面更容易找到问题。

参考资料

  1. RFC 9110 HTTP Semantics

  2. RFC 9111 HTTP Caching

  3. RFC 6585 Additional HTTP Status Codes