在日常的网络浏览和 Web 开发过程中,我们总会不可避免地遇到各种 HTTP 状态码。比如常见的 “404 Not Found”,它意味着我们所请求的页面不存在;还有 “500 Internal Server Error”,表示服务器端出现了错误。这些由三位数字组成的代码,看似简单,却承载着 Web 服务器与客户端之间重要的通信信息,是排查网络问题、优化 Web 应用性能的关键 “密码”。本文将带大家全面、深入地了解 HTTP 状态码,从基础概念到各类状态码的详细解读,再到实际应用中的实用技巧,助你轻松掌握这一 Web 开发与网络使用的必备知识。
一、HTTP 状态码的基础认知
HTTP 状态码(HTTP Status Code)是由万维网联盟(W3C)定义的,用于表示 HTTP 请求处理结果的三位数字代码。当客户端(如浏览器、手机 App 等)向 Web 服务器发送一个 HTTP 请求后,服务器会根据请求的处理情况,返回一个包含状态码的响应头,客户端再根据这个状态码来判断请求是否成功,并采取相应的后续操作。
HTTP 状态码的首位数字决定了其所属的类别,共分为五大类,分别对应不同的响应情况,这为我们快速判断请求问题所在提供了清晰的方向。
二、五大类 HTTP 状态码详细解析
(一)1xx 信息性状态码:请求已接收,继续处理
1xx 系列状态码属于信息提示类,它表示服务器已经成功接收了客户端发送的请求,并且正在对请求进行进一步的处理,同时告知客户端需要继续等待后续的响应。这类状态码在实际应用中并不常见,因为大部分客户端会自动处理后续流程,不会将其直接展示给用户。
- 100 Continue(继续):当客户端向服务器发送包含请求体的 POST 或 PUT 等请求时,会先发送一个不带请求体、仅包含Expect: 100-continue头字段的请求,用于询问服务器是否愿意接收后续的请求体。如果服务器返回 100 Continue 状态码,就表示服务器已经做好了接收请求体的准备,客户端可以继续发送请求体;若服务器返回其他状态码(如 400 Bad Request),则客户端需要停止发送请求体,并根据返回的状态码进行相应处理。例如,在文件上传场景中,客户端先发送请求头部询问服务器,服务器返回 100 Continue 后,客户端才开始上传文件数据,这样可以避免在服务器无法处理该请求时,客户端白白上传大量数据,节省网络资源。
- 101 Switching Protocols(切换协议):该状态码表示服务器同意根据客户端的请求,将当前使用的 HTTP 协议切换为其他协议,比如 WebSocket 协议。在一些需要实时通信的应用中,如在线聊天、实时游戏数据同步等,客户端会先通过 HTTP 协议向服务器发送请求,要求切换到 WebSocket 协议。当服务器返回 101 Switching Protocols 状态码时,就意味着协议切换成功,之后客户端和服务器就可以通过新的协议进行高效的双向通信,不再受 HTTP 协议单向请求 - 响应模式的限制。
(二)2xx 成功状态码:请求已成功处理
2xx 系列状态码是我们在网络请求中最希望看到的,它们表示客户端发送的 HTTP 请求已经被服务器成功接收、理解并处理完成,服务器会根据请求的类型返回相应的成功响应数据。
- 200 OK(成功):这是最常见的成功状态码,几乎所有成功的 GET、POST、PUT 等请求(除了需要特殊处理的情况)都会返回该状态码。它表示服务器已经成功处理了客户端的请求,并将请求的资源或处理结果通过响应体返回给客户端。例如,当我们在浏览器中输入网址访问一个网页时,若服务器正常响应,就会返回 200 OK 状态码,并将网页的 HTML、CSS、JavaScript 等资源一并返回,浏览器再将这些资源渲染成我们看到的网页;当我们在 App 中提交表单数据(如注册、登录),服务器验证通过并处理完成后,也会返回 200 OK 状态码,同时可能返回用户信息、操作成功提示等数据。
- 201 Created(已创建):该状态码通常用于 POST 请求,表示服务器已经成功根据客户端的请求创建了新的资源。例如,在 RESTful API 开发中,当客户端发送 POST 请求向服务器提交数据以创建一个新的用户、一篇文章或一个订单时,若创建成功,服务器会返回 201 Created 状态码,并且在响应头的Location字段中指定新创建资源的 URI(统一资源标识符),客户端可以通过该 URI 直接访问新创建的资源。同时,响应体中可能会包含新创建资源的详细信息,方便客户端后续操作。比如,客户端发送 POST 请求创建一个新用户,服务器返回 201 Created,Location字段为/users/123,表示新用户的 ID 为 123,客户端后续可以通过访问/users/123来获取该用户的信息。
- 204 No Content(无内容):此状态码表示服务器已经成功处理了客户端的请求,但没有返回任何响应体数据。它通常用于那些只需要服务器执行某个操作,而不需要返回具体资源内容的请求,比如 DELETE 请求删除资源、PUT 请求更新资源但不需要返回更新后的资源详情等。例如,当客户端发送 DELETE 请求删除一个不需要的文件或一条过期的数据时,服务器成功删除后,会返回 204 No Content 状态码,告知客户端操作已成功,但由于资源已被删除,没有额外的数据需要返回;当客户端发送 PUT 请求更新用户的部分信息(如修改密码),服务器更新成功后,若不需要返回完整的用户信息,也可以返回 204 No Content 状态码。
- 206 Partial Content(部分内容):该状态码用于断点续传和分片下载场景,表示服务器成功处理了客户端的部分请求,只返回了请求资源的一部分。当客户端需要下载一个较大的文件(如视频、大型安装包等)时,为了提高下载效率、避免因网络中断导致重新下载,客户端会将文件分成多个部分,每次只请求其中的一部分,并在请求头中通过Range字段指定请求的字节范围(如Range: bytes=0-1023表示请求文件的前 1024 个字节)。服务器接收到这样的请求后,会根据Range字段返回对应的部分文件数据,并返回 206 Partial Content 状态码,同时在响应头中通过Content-Range字段告知客户端当前返回数据的字节范围以及整个文件的总大小(如Content-Range: bytes 0-1023/10240表示当前返回 0-1023 字节,文件总大小为 10240 字节)。客户端接收到各部分数据后,会将它们拼接成完整的文件。
(三)3xx 重定向状态码:需要进一步操作以完成请求
3xx 系列状态码表示客户端发送的请求需要通过进一步的操作(通常是跳转至其他 URL)才能完成。服务器会通过响应头中的Location字段指定客户端需要跳转的目标 URL,客户端根据状态码的具体含义和Location字段的值进行相应的重定向操作。
- 301 Moved Permanently(永久重定向):该状态码表示请求的资源已经被永久地移动到了新的 URL(由Location字段指定),以后所有对该旧 URL 的请求都应该直接发送到新的 URL。搜索引擎在抓取网页时,如果发现某个页面返回 301 Moved Permanently 状态码,会将旧 URL 的权重和排名转移到新 URL 上,不会对网站的 SEO(搜索引擎优化)造成负面影响。常见的应用场景包括:网站域名更换后,将旧域名的所有请求重定向到新域名;网站页面结构调整,某个页面的 URL 发生改变,将旧 URL 重定向到新 URL,以保证用户通过旧链接仍能访问到正确的内容。例如,旧网址http://old-example.com/page返回 301 状态码,Location字段为http://new-example.com/new-page,之后用户再访问旧网址时,浏览器会自动跳转到新网址,且后续再次访问该旧网址时,会直接从缓存中获取新网址进行跳转(部分浏览器会缓存 301 重定向)。
- 302 Found(临时重定向):此状态码表示请求的资源临时被移动到了新的 URL(由Location字段指定),但这种移动只是暂时的,未来资源可能还会回到原来的旧 URL。与 301 永久重定向不同,搜索引擎在遇到 302 临时重定向时,不会将旧 URL 的权重转移到新 URL 上,仍会保留旧 URL 的索引和排名。应用场景包括:网站进行临时维护时,将所有请求重定向到一个临时维护页面;用户未登录时,访问需要登录才能查看的页面,服务器将请求重定向到登录页面,用户登录成功后再跳转回原来请求的页面;电商网站在促销活动期间,将某个商品的链接临时重定向到活动专题页面,活动结束后再恢复原来的链接。例如,用户访问http://example.com/member(需要登录的会员页面),若未登录,服务器返回 302 Found 状态码,Location字段为http://example.com/login,浏览器自动跳转到登录页面,用户登录后,服务器再将其重定向回http://example.com/member页面。
- 304 Not Modified(未修改):该状态码用于缓存机制,表示客户端请求的资源自上次请求以来没有发生修改,服务器不需要返回完整的资源内容,客户端可以直接使用本地缓存的资源。这一机制极大地减少了网络传输的数据量,提高了网页加载速度,降低了服务器的负载。其工作原理是:客户端第一次请求资源时,服务器返回资源内容和响应头,其中包含Last-Modified(资源最后修改时间)或ETag(资源的唯一标识,如文件哈希值)字段。当客户端再次请求该资源时,会在请求头中通过If-Modified-Since(对应Last-Modified)或If-None-Match(对应ETag)字段携带上次获取的资源修改时间或标识。服务器接收到请求后,会根据这些字段判断资源是否发生变化:若资源未修改,就返回 304 Not Modified 状态码,不返回响应体;若资源已修改,则返回 200 OK 状态码和更新后的资源内容。例如,我们第二次访问同一个网页时,浏览器会发送带有If-Modified-Since或If-None-Match的请求,若网页未更新,服务器返回 304,浏览器直接使用本地缓存的网页数据进行渲染,让网页瞬间加载完成。
- 307 Temporary Redirect(临时重定向,保持请求方法):307 状态码与 302 Found 类似,都表示资源临时被移动到新 URL,但它有一个重要的区别:307 要求客户端在重定向时必须保持原来的请求方法不变,而 302 在实际应用中,部分客户端可能会将 POST 请求改为 GET 请求(这是不符合 HTTP 标准的,但由于历史原因,一些浏览器存在这样的行为)。在需要严格保持请求方法的场景下,应优先使用 307 Temporary Redirect。例如,客户端通过 POST 请求向服务器提交表单数据,由于某些原因(如服务器临时故障,需要将请求转移到备用服务器),服务器需要将请求临时重定向到新 URL。此时若使用 302 状态码,部分浏览器可能会将 POST 请求改为 GET 请求,导致表单数据无法正确提交;而使用 307 状态码,客户端会严格按照原来的 POST 方法向新 URL 发送请求,确保数据提交的正确性。
- 308 Permanent Redirect(永久重定向,保持请求方法):308 状态码与 301 Moved Permanently 类似,都表示资源永久被移动到新 URL,但它同样要求客户端在重定向时保持原来的请求方法不变,这一点与 307 对应 302 的关系一致。在需要永久重定向且必须保持请求方法的场景下,应使用 308 Permanent Redirect 替代 301。例如,一个 API 接口的 URL 发生了永久性变更,且该接口主要接收 POST 请求。若使用 301 状态码进行重定向,部分客户端可能会将 POST 请求改为 GET 请求,导致 API 无法正常工作;而使用 308 状态码,客户端会始终以 POST 方法向新的 API URL 发送请求,保证 API 服务的连续性。
(四)4xx 客户端错误状态码:请求存在错误,服务器无法处理
4xx 系列状态码表示客户端发送的请求存在错误(如请求的资源不存在、权限不足、请求格式不正确等),导致服务器无法正常处理该请求。这类错误的责任通常在客户端,需要客户端修正请求后重新发送。
- 400 Bad Request(错误请求):该状态码表示服务器无法理解客户端发送的请求,因为请求存在语法错误、参数缺失或参数格式不正确等问题。例如,客户端向服务器发送 POST 请求提交表单数据时,未按照服务器要求的格式传递参数(如将数字类型的参数传递为字符串、缺少必填的表单字段);或者在发送 JSON 格式的请求体时,JSON 语法错误(如缺少引号、逗号使用错误等)。服务器接收到这样的请求后,无法解析和处理,就会返回 400 Bad Request 状态码,并可能在响应体中说明具体的错误原因(如 “缺少必填参数:username”“JSON 格式错误:第 5 行缺少右引号”),帮助客户端开发者排查问题。
- 401 Unauthorized(未授权):此状态码表示客户端在请求需要身份验证的资源时,未提供有效的身份凭证(如用户名密码、Token 令牌等),或者提供的凭证无效。服务器通过该状态码告知客户端,需要先进行身份验证才能访问该资源。在响应头中,服务器通常会通过WWW-Authenticate字段指定需要的身份验证方式(如 Basic 认证、Bearer Token 认证等)。例如,用户未登录就直接访问需要登录的后台管理系统页面,或者客户端在调用需要 Token 验证的 API 接口时,未在请求头中携带 Token,或携带的 Token 已过期、无效,服务器都会返回 401 Unauthorized 状态码。此时,客户端需要引导用户进行登录操作(如跳转到登录页面),或重新获取有效的 Token 并携带在请求中,再次发送请求。
- 403 Forbidden(禁止访问):该状态码表示客户端已经通过了身份验证(即服务器知道客户端是谁),但客户端所拥有的权限不足以访问请求的资源,服务器拒绝提供该资源的访问权限。与 401 Unauthorized(未验证身份)不同,403 Forbidden 强调的是 “身份已验证,但权限不够”。例如,普通用户登录后台管理系统后,尝试访问只有管理员才能查看的 “用户管理”“系统设置” 等页面;或者客户端通过 API 接口请求获取其他用户的隐私数据(如查看其他用户的订单记录、个人联系方式),但该客户端的账号没有对应的访问权限,服务器都会返回 403 Forbidden 状态码。此时,即使客户端重新提交身份凭证,只要权限未变更,请求仍会被拒绝,需要联系管理员提升权限才能访问。
- 404 Not Found(未找到):这是最广为人知的客户端错误状态码,表示客户端请求的资源在服务器上不存在。导致 404 的原因有很多,比如:客户端输入的 URL 错误(如拼写错误、网址路径错误);服务器上的资源被删除或移动,但未设置相应的重定向;网站路由配置错误,导致服务器无法将请求映射到正确的资源。例如,用户想访问http://example.com/about页面,但实际网站中并没有该页面(正确路径可能是http://example.com/about-us);或者服务器上原来存在的文件http://example.com/files/report.pdf被删除,客户端再次请求该文件时,服务器就会返回 404 Not Found 状态码。为了提升用户体验,很多网站会自定义 404 页面,向用户说明页面不存在,并提供返回首页、搜索等功能。
- 405 Method Not Allowed(方法不允许):该状态码表示客户端使用的 HTTP 请求方法(如 GET、POST、PUT、DELETE 等)在当前请求的 URL 上不被允许。服务器会在响应头的Allow字段中列出该 URL 支持的所有请求方法,帮助客户端了解正确的请求方式。例如,某个 API 接口http://example.com/api/users只支持 GET(获取用户列表)和 POST(创建用户)方法,若客户端使用 PUT 方法向该接口发送请求(意图更新用户信息),服务器就会返回 405 Method Not Allowed 状态码,同时Allow字段会显示GET, POST,告知客户端该接口仅支持这两种请求方法。此时,客户端需要检查请求方法是否符合服务器的接口规范,更换为允许的方法后重新发送请求。
- 406 Not Acceptable(无法接受):此状态码表示服务器无法返回客户端在请求头中通过Accept字段指定的格式或类型的资源。Accept字段用于客户端告知服务器自己能够处理的响应内容类型(如text/html、application/json、image/jpeg等)。如果服务器没有客户端可接受的资源类型,就会返回 406 Not Acceptable 状态码。例如,客户端发送请求时,在请求头中设置Accept: application/xml,表示只接受 XML 格式的响应数据,但服务器该接口仅能返回 JSON 格式的数据(application/json),无法满足客户端的要求,就会返回 406 状态码。此时,客户端需要修改Accept字段,允许接收服务器支持的内容类型,或者服务器需要扩展支持的响应格式。
- 408 Request Timeout(请求超时):该状态码表示服务器在规定的时间内没有收到客户端发送的完整请求(包括请求头和请求体)
三、总结
状态码 | 代码名称 | 所属类别 | 核心说明 |
100 | Continue | 1xx 信息性状态码 | 服务器已接收请求头,告知客户端可继续发送请求体,常用于文件上传等场景避免资源浪费 |
101 | Switching Protocols | 1xx 信息性状态码 | 服务器同意按客户端请求切换协议(如 HTTP 转 WebSocket),支持实时双向通信 |
200 | OK | 2xx 成功状态码 | 最常见成功码,服务器已成功处理请求并返回对应资源或结果,适用于多数 GET、POST 等请求 |
201 | Created | 2xx 成功状态码 | 用于 POST 请求,服务器成功创建新资源,响应头 Location 字段会指定新资源 URI |
204 | No Content | 2xx 成功状态码 | 服务器成功处理请求,但无响应体返回,适用于 DELETE 删除资源、PUT 更新无需返回详情等场景 |
206 | Partial Content | 2xx 成功状态码 | 用于断点续传 / 分片下载,服务器仅返回请求资源的部分内容,响应头含 Content-Range 说明范围 |
301 | Moved Permanently | 3xx 重定向状态码 | 资源永久迁移至新 URL,后续请求需直接访问新地址,搜索引擎会转移旧 URL 权重 |
302 | Found | 3xx 重定向状态码 | 资源临时迁移至新 URL,未来可能恢复原地址,搜索引擎不转移旧 URL 权重,部分客户端可能变更请求方法 |
304 | Not Modified | 3xx 重定向状态码 | 基于缓存机制,资源未修改,客户端可直接使用本地缓存,减少网络传输和服务器负载 |
307 | Temporary Redirect | 3xx 重定向状态码 | 类似 302,但严格要求客户端重定向时保持原请求方法,避免 POST 变 GET 等问题 |
308 | Permanent Redirect | 3xx 重定向状态码 | 类似 301,但严格要求客户端重定向时保持原请求方法,适用于需永久跳转且保持方法的场景 |
400 | Bad Request | 4xx 客户端错误状态码 | 服务器无法理解请求,因请求存在语法错误、参数缺失 / 格式错误等,需客户端修正后重试 |
401 | Unauthorized | 4xx 客户端错误状态码 | 请求需身份验证,但客户端未提供有效凭证(如 Token 过期、未登录),需完成验证后再请求 |
403 | Forbidden | 4xx 客户端错误状态码 | 客户端已通过身份验证,但权限不足无法访问资源,提升权限后才可正常请求 |
404 | Not Found | 4xx 客户端错误状态码 | 客户端请求的资源在服务器不存在,可能因 URL 错误、资源被删或路由配置问题 |
405 | Method Not Allowed | 4xx 客户端错误状态码 | 客户端使用的 HTTP 方法(如 PUT)在当前 URL 不被允许,响应头 Allow 字段会列出支持的方法 |
406 | Not Acceptable | 4xx 客户端错误状态码 | 服务器无法返回客户端通过 Accept 字段指定的内容类型(如仅支持 JSON 却要求 XML) |
408 | Request Timeout | 4xx 客户端错误状态码 | 服务器在规定时间内未收到客户端的完整请求(含请求头和请求体) |
500 | Internal Server Error | 5xx 服务器错误状态码 | 服务器在处理请求时发生未知的内部错误(如代码逻辑 bug、数据库连接失败等),无法完成请求处理,需开发者排查服务器端问题 |
502 | Bad Gateway | 5xx 服务器错误状态码 | 作为网关 / 代理的服务器,从上游服务器(如后端业务服务器)接收了无效响应,常见于分布式系统中上游服务故障 |
503 | Service Unavailable | 5xx 服务器错误状态码 | 服务器当前无法处理请求(如服务器过载、维护中),通常是临时状态,响应头可能含 Retry-After 告知重试时间 |
504 | Gateway Timeout | 5xx 服务器错误状态码 | 作为网关 / 代理的服务器,等待上游服务器响应超时,可能因上游服务器处理缓慢或故障导致 |