什么是HTTP状态码?新手也能看懂的完整解析

原创 发布日期:
20

一、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 /users201 CreatedLocation: /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-SinceIf-None-Match头,问服务器:"这个资源改了没?"如果没改,服务器返回304,浏览器直接用本地缓存,不重新下载。这就是为什么有时候刷新页面速度很快的原因。

关于重定向的一个重要机制: 当301、302、303返回时,几乎所有浏览器都会把POST改成GET,并删除请求报文内的主体,然后重新发送。这是为了防止重复提交。所以307和308的价值就在于:它们强制保留原请求方法,更适合API和REST场景。

什么是HTTP状态码?新手也能看懂的完整解析

六、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状态码大全

工具类型: 对照表
使用次数: 79
HTTP状态查询工具

HTTP状态查询工具

工具类型: 站长工具
使用次数: 116
打赏
THE END
作者头像
fuwa
我爱我的参差不齐 我即是自己的反义词