什么是HTTP状态码?新手也能看懂的完整解析
一、HTTP状态码到底是什么?
当你在浏览器地址栏输入一个网址,按下回车的那一刻,你的浏览器就向目标服务器发出了一个HTTP请求。服务器收到请求后,会处理它,然后返回一个结果。这个结果里,包含一串三位数字的代码——这就是HTTP状态码(HTTP Status Code)。
简单来说,HTTP状态码就是服务器和浏览器之间沟通的"信号"。它告诉你:请求成功了吗?失败了吗?失败的原因是你的错还是服务器的错?需要跳转到别的地址吗?
HTTP状态码由RFC 2616规范定义,并得到RFC 2518、RFC 2817、RFC 2295、RFC 2774、RFC 4918等规范扩展。目前最新的核心规范为RFC 7231(HTTP/1.1语义)。状态码的官方注册由互联网号码分配局(IANA)维护。
状态码由三位十进制数字组成,出现在HTTP响应的第一行。 第一位数字决定了状态码的大类,后两位数字用于细分具体语义。
二、HTTP状态码的五大分类
所有HTTP状态码按首位数字分为五大类,每一类有明确的语义:
| 分类 | 首位数字 | 核心含义 | 通俗理解 |
|---|---|---|---|
| 信息响应 | 1xx | 服务器已接收请求,正在处理 | "我收到了,稍等" |
| 成功响应 | 2xx | 请求成功处理并返回结果 | "搞定了,给你数据" |
| 重定向 | 3xx | 请求的资源位置变了,需要跳转 | "要找的东西不在这,去xxx找" |
| 客户端错误 | 4xx | 客户端(浏览器/你的请求)有问题 | "是你的错,请求无效" |
| 服务器错误 | 5xx | 服务器处理请求时出错 | "是我的错,我搞砸了" |
这五大类涵盖了HTTP请求从发出到得到响应的全部可能结果。掌握这个分类框架,你就掌握了HTTP状态码的"地图"。
三、1xx 信息响应——"稍等,我在处理"
1xx类状态码表示临时响应,服务器已收到请求的第一部分,正在等待其余部分。 这类状态码仅用于协议层交互,浏览器和普通业务代码几乎感知不到。
| 状态码 | 名称 | 含义 | 典型场景 |
|---|---|---|---|
| 100 | Continue(继续) | 服务器已收到请求头,允许客户端继续发送请求体 | 大文件上传前的预检查 |
| 101 | Switching Protocols(切换协议) | 服务器同意切换通信协议 | HTTP升级为WebSocket |
| 102 | Processing(处理中) | 服务器已接收请求并开始处理,但尚未完成 | WebDAV批量文件操作 |
重点理解100 Continue: 当客户端要上传一个很大的文件时,它不想一上来就把整个文件传过去,万一服务器不接受呢?所以它会先发请求头,并带上Expect: 100-continue字段,相当于问服务器:"我要传个大文件,你收不收?"服务器如果愿意,就返回100,客户端再传文件体;如果不愿意,返回417(Expectation Failed)。
四、2xx 成功响应——"搞定了"
2xx类状态码表示请求已被服务器成功接收、理解并处理。 这是我们最希望看到的一类。但不同的2xx状态码代表"成功的不同语义",不应只会用200。
| 状态码 | 名称 | 含义 | 典型场景 |
|---|---|---|---|
| 200 | OK | 请求成功,服务器返回请求的内容 | 网页访问、接口查询、文件下载 |
| 201 | Created | 请求成功,且服务器新建了资源 | POST创建新用户、新文章 |
| 202 | Accepted | 请求已接受,但尚未处理完成 | 异步任务提交、批量处理 |
| 204 | No Content | 请求成功,但响应体为空 | DELETE删除操作成功 |
| 206 | Partial Content | 服务器返回资源的一部分 | 断点续传、视频分段加载 |
重点理解各状态码的使用建议:
查询成功 → 200:最通用的成功码,返回完整响应体。
创建资源 → 201:通常配合
Location响应头,告诉客户端新资源在哪里。例如:POST /users→201 Created,Location: /users/123。异步任务 → 202:服务器已接受请求,但处理在后台进行。不保证最终成功,不返回处理结果。
删除成功 → 204:响应体为空,不改变当前页面状态。
分段下载 → 206:客户端请求头包含
Range: bytes=0-1023,服务器返回部分内容,配合Content-Range头。
200 OK是最常见的成功码,但绝不是唯一的成功码。 很多新手在所有成功场景都返回200,这在REST API设计中是不规范的。
五、3xx 重定向——"去别的地方找"
3xx类状态码表示请求的资源位置发生了变化,客户端需要重新请求。 通俗说就是:"要找的东西不在这,去xxx找。"
| 状态码 | 名称 | 含义 | 核心特点 |
|---|---|---|---|
| 301 | Moved Permanently | 永久重定向 | 浏览器会缓存,搜索引擎更新索引 |
| 302 | Found | 临时重定向 | 浏览器不缓存,原URL仍然有效 |
| 303 | See Other | 应使用GET方法获取资源 | 常用于POST后跳转到结果页 |
| 304 | Not Modified | 资源未修改,可使用缓存 | 节省带宽,刷新网页时常见 |
| 307 | Temporary Redirect | 临时重定向(保留请求方法) | 比302更安全,保留POST方法 |
| 308 | Permanent Redirect | 永久重定向(保留请求方法) | 比301更安全,适合API场景 |
301 vs 302:最常考也最实用的区别
| 对比项 | 301 永久重定向 | 302 临时重定向 |
|---|---|---|
| 语义 | 资源永久迁移到新地址 | 资源暂时从新地址响应 |
| 浏览器行为 | 缓存重定向,下次直接访问新地址 | 不缓存,每次都重新请求 |
| 搜索引擎 | 更新索引,旧URL权重转移到新URL | 保留旧URL索引,不转移权重 |
| 书签 | 浏览器会更新书签为新地址 | 书签保持原地址不变 |
| 使用场景 | 网站域名更换、URL结构调整 | 未登录访问跳转到登录页、临时维护 |
重点理解304 Not Modified: 当你刷新网页时,浏览器会发送If-Modified-Since或If-None-Match头,问服务器:"这个资源改了没?"如果没改,服务器返回304,浏览器直接用本地缓存,不重新下载。这就是为什么有时候刷新页面速度很快的原因。
关于重定向的一个重要机制: 当301、302、303返回时,几乎所有浏览器都会把POST改成GET,并删除请求报文内的主体,然后重新发送。这是为了防止重复提交。所以307和308的价值就在于:它们强制保留原请求方法,更适合API和REST场景。

六、4xx 客户端错误——"是你的错"
4xx类状态码表示请求可能出错,妨碍了服务器的处理。 本质上是:服务器拒绝当前请求。 问题出在客户端(浏览器/你发的请求)。
| 状态码 | 名称 | 含义 | 常见原因 |
|---|---|---|---|
| 400 | Bad Request | 请求语法错误,服务器看不懂 | 参数传错、JSON格式错误 |
| 401 | Unauthorized | 未授权,需要身份验证 | 未登录就访问需要权限的页面 |
| 403 | Forbidden | 拒绝访问,服务器知道但不让你看 | 权限不够,普通用户访问管理员页面 |
| 404 | Not Found | 服务器找不到请求的资源 | URL输错、页面被删除 |
| 405 | Method Not Allowed | 请求方法不对 | 用GET提交表单,服务器只接受POST |
| 408 | Request Timeout | 请求超时 | 客户端发送请求时间过长 |
| 409 | Conflict | 请求冲突 | 并发修改导致版本冲突 |
| 410 | Gone | 资源永久删除 | 与404不同,明确表示"永远不会再有" |
| 413 | Request Entity Too Large | 请求实体过大 | 上传文件超过服务器限制 |
| 414 | Request-URI Too Long | 请求URI过长 | URL太长服务器无法处理 |
| 415 | Unsupported Media Type | 不支持的媒体类型 | Content-Type不被支持,如传了XML但只接受JSON |
| 422 | Unprocessable Entity | 语法正确但业务校验失败 | 如邮箱格式正确但已被注册 |
| 429 | Too Many Requests | 请求过于频繁 |
被限流,通常返回Retry-After头 |
400 vs 422:一个重要的区分
400 Bad Request:请求本身有问题,语法错误、参数缺失、JSON解析失败。服务器根本不理解你在说什么。
422 Unprocessable Entity:请求语法完全正确,但业务逻辑不通过。比如你提交注册表单,邮箱格式没问题,但这个邮箱已经被注册了。
422比400更"语义正确",在REST API设计中被强烈推荐使用。
401 vs 403:一字之差,含义不同
| 状态码 | 含义 | 通俗理解 |
|---|---|---|
| 401 Unauthorized | 你是谁?我不认识你,先登录 | "请先出示证件" |
| 403 Forbidden | 我知道你是谁,但你没资格看 | "证件有效,但你没权限进这个房间" |
404 Not Found:互联网最著名的错误码
404是4xx类中最常见、最臭名昭著的状态码。它表示服务器无法找到请求的资源。可能原因包括:
URL地址输入错误
页面已被删除或移动
伪静态规则变更导致旧URL失效
DNS设置问题
对SEO的影响: 如果一个网站404页面过多,搜索引擎会认为网站处于改版或被攻击状态,可能进行降权处理。因此,正确配置404状态码至关重要。自定义404页面时,必须确保服务器返回的是404状态码,而不是200。有些网站用Meta Refresh跳转,结果返回302,这对SEO是有害的。
正确做法: 设置404指向一个设计好的HTML文件,或者在动态页面中添加Response.Status = "404 Not Found",确保响应状态码为404。
七、5xx 服务器错误——"是我的错"
5xx类状态码表示服务器在尝试处理请求时发生内部错误。 请求本身是合法的,问题出在服务器端。
| 状态码 | 名称 | 含义 | 典型原因 |
|---|---|---|---|
| 500 | Internal Server Error | 服务器内部通用错误 | 代码bug、数据库连接失败、配置错误 |
| 501 | Not Implemented | 服务器不具备完成请求的功能 | 服务器不识别请求方法 |
| 502 | Bad Gateway | 网关错误,从上游收到无效响应 | Nginx代理后端服务器挂了 |
| 503 | Service Unavailable | 服务暂时不可用 | 服务器超载或停机维护 |
| 504 | Gateway Timeout | 网关超时,上游服务器未及时响应 | "传话的"等太久没等到回复 |
500 vs 502 vs 503:怎么区分?
| 状态码 | 问题出在哪 | 通俗理解 |
|---|---|---|
| 500 | 服务器自身代码/配置出错 | "我自己出bug了" |
| 502 | 作为网关/代理时,上游服务器返回无效响应 | "我找别人帮忙,但那人没正常回复" |
| 503 | 服务器暂时无法处理(超载/维护) | "我现在太忙了/在维修,稍后再来" |
| 504 | 网关等上游服务器等超时了 | "我等了半天,传话的都没回复" |
重点理解502 Bad Gateway: 这个错误在使用Nginx等反向代理时非常常见。Nginx本身没问题,是它要转发请求的后端服务器(如PHP-FPM、Tomcat、Node.js)出了问题。所以排查502时,一定要从后端找原因,而不是只看Nginx。
重点理解503 Service Unavailable: 这通常是暂时状态。比如网站维护时会主动返回503,告诉搜索引擎:"我只是暂时不在,别把我从索引里删掉。"如果长时间返回503且没有Retry-After头,搜索引擎可能会降低抓取频率甚至移除索引。
八、实战速查表:一张表搞定常见状态码
| 状态码 | 分类 | 一句话含义 | 你该怎么做 |
|---|---|---|---|
| 100 | 1xx | 继续发送请求体 | (协议层,无需处理) |
| 101 | 1xx | 切换协议(如WebSocket) | (协议层,无需处理) |
| 200 | 2xx | 请求成功 | 正常使用返回的数据 |
| 201 | 2xx | 资源创建成功 | 查看Location头获取新资源地址 |
| 204 | 2xx | 成功但无内容 | 操作成功,无需额外处理 |
| 206 | 2xx | 部分内容 | 合并分段数据 |
| 301 | 3xx | 永久重定向 | 更新链接/书签,搜索引擎会转移权重 |
| 302 | 3xx | 临时重定向 | 临时跳转,原URL仍然有效 |
| 304 | 3xx | 未修改,用缓存 | 浏览器使用本地缓存,节省流量 |
| 400 | 4xx | 请求格式错误 | 检查请求参数和格式 |
| 401 | 4xx | 未登录/未授权 | 登录后重试 |
| 403 | 4xx | 无权限访问 | 联系管理员获取权限 |
| 404 | 4xx | 资源不存在 | 检查URL是否正确 |
| 405 | 4xx | 方法不支持 | 换用正确的HTTP方法 |
| 408 | 4xx | 请求超时 | 检查网络,重试 |
| 409 | 4xx | 资源冲突 | 刷新后重试 |
| 410 | 4xx | 资源永久删除 | 该资源已不可用,无需再试 |
| 413 | 4xx | 请求过大 | 减小上传文件大小 |
| 415 | 4xx | 媒体类型不支持 | 修改Content-Type |
| 422 | 4xx | 业务校验失败 | 修正业务数据后重试 |
| 429 | 4xx | 请求太频繁 |
等待Retry-After时间后重试 |
| 500 | 5xx | 服务器内部错误 | 联系服务端排查bug |
| 501 | 5xx | 功能未实现 | 检查服务器配置 |
| 502 | 5xx | 网关错误 | 检查后端服务是否正常 |
| 503 | 5xx | 服务不可用 | 稍后重试 |
| 504 | 5xx | 网关超时 | 检查后端服务响应时间 |
九、如何查看HTTP状态码?
在日常开发和调试中,查看HTTP状态码非常简单:
浏览器F12开发者工具 → Network(网络)标签 → 查看Status列
在线工具:输入任意网址即可查询其HTTP状态码
命令行:使用
curl -I https://www.fuwa.org可以只查看响应头和状态码
十、常见误区澄清
误区一:404就是"服务器找不到"
不完全对。404的准确含义是服务器找不到你请求的那个资源,不代表服务器本身有问题。服务器正常运行,只是你要的那个页面/文件不存在。
误区二:500就是服务器彻底崩了
不一定。500是服务器内部通用错误码,原因可能是代码bug、数据库连接超时、配置文件错误等。很多时候重启服务或修复代码就能解决。
误区三:301和302对用户来说没区别
对用户体验来说确实都是"跳转到新页面",但对搜索引擎和浏览器缓存来说区别巨大。301会让搜索引擎把旧URL的权重转移到新URL,302不会。
误区四:自定义404页面返回200也行
不行。 如果自定义404页面返回200状态码,搜索引擎会认为这是一个正常页面,而不是错误页面。这会导致搜索引擎继续索引这个"不存在的页面",对SEO极为不利。必须确保404页面返回404状态码。
十一、总结
HTTP状态码是Web通信的基础语言。五大分类、三位数字,背后是一套清晰的逻辑:
1xx:协议层在说话,你不用管
2xx:成功了,但成功也分很多种
3xx:资源搬家了,跟着走
4xx:你的请求有问题,改了再来
5xx:服务器的问题,等它修好
对于开发者,正确使用状态码是REST API设计的基本功。不要所有成功都返回200,不要所有权限问题都返回403。对于普通用户,看到404就检查URL,看到503就稍后再试,看到301就知道这个页面已经永久搬家了。
掌握HTTP状态码,你就掌握了Web世界里最基础也最重要的"交通信号灯"。
相关工具
HTTP状态码大全
HTTP状态查询工具
版权及免责申明:本文由@fuwa原创发布。该文章观点仅代表作者本人,不代表本站立场。本站不承担任何相关法律责任。
如若转载,请注明出处:https://www.fuwa.org/tutorials/what-is-http-status-code.html

