掌握 HTTP 状态码

HTTP状态码为何重要

HTTP状态码并非仅仅是数字,而是服务器传达客户端请求结果的标准化途径。其重要性体现在以下方面:

  1. 错误诊断:有助于迅速识别并解决Web应用程序中的问题。

  2. 用户体验:正确运用状态码可实现更优的错误处理与用户反馈。

  3. SEO影响:搜索引擎借助状态码理解网站结构与内容可用性。

  4. API设计:良好实现的状态码对创建清晰有效的API至关重要。

  5. 性能优化:某些状态码有助于缓存和资源管理。

HTTP状态码剖析

HTTP状态码为三位数数字,分为五类,每类均有特定用途:

  1. 1xx:信息性响应

  2. 2xx:成功响应

  3. 3xx:重定向消息

  4. 4xx:客户端错误响应

  5. 5xx:服务器错误响应

接下来深入探究每种类别及可能遇到的状态码。

1XX信息性响应

此类状态码表示服务器已收到请求并正在继续处理。

  1. 100 Continue:此临时响应表明目前一切正常,客户端可继续请求;若已完成则可忽略。常用于客户端发送大型请求体时,在发送整个有效负载前,用于确认服务器是否愿意接受。

  2. 101 Switching Protocols:此代码针对客户端的Upgrade请求头发出响应,表示服务器正在切换到的协议。常用于WebSocket连接,客户端请求从HTTP升级到WebSocket协议时使用。

  3. **102 Processing (WebDAV):**此状态码用于通知客户端服务器已接受完整请求但尚未完成处理,可防止客户端超时并认为请求已丢失。

  4. 103 Early Hints:此状态码主要与Link头一同使用,让用户代理在服务器准备响应时开始预加载资源。通过允许浏览器在主响应准备好之前获取资源,有助于改善感知页面加载时间。

2XX成功响应

这些状态码表示客户端的请求已被服务器成功接收、理解并接受。

  1. 200 OK:这是成功HTTP请求的标准响应,实际响应取决于所使用的请求方法。例如,GET请求的响应包含与所请求资源对应的实体;POST请求的响应包含描述或操作结果的实体。

  2. 201 Created:此状态码表示请求已完成,并创建了一个或多个新资源。常用于响应POST请求或某些PUT请求,新资源的URI通常在响应的Location头中指定。

  3. 202 Accepted:此响应代码表示请求已被接受处理,但处理尚未完成。常用于异步操作,202响应有意不做承诺,目的是允许服务器接受对其他进程的请求(可能是每天仅运行一次的面向批处理的进程),而无需用户代理与服务器的连接持续到进程完成。

  4. 203 Non-Authoritative Information:此响应代码表示返回的元数据与源服务器提供的不完全相同,而是从本地或第三方副本收集的。用于其他资源的镜像或备份,除特定情况外,首选200 OK响应。

  5. 204 No Content:此状态码表示服务器已成功完成请求,响应有效负载主体中无其他内容要发送。通常用作成功DELETE请求的响应。

  6. 205 Reset Content:此响应代码告知客户端重置文档视图,对于表单提交后需要刷新用户界面的Web应用程序很有用。

  7. 206 Partial Content:当客户端发送范围头仅请求资源的一部分时使用此状态码,常用于恢复中断的下载或将大型下载拆分为多个同时的流。

  8. **207 Multi-Status (WebDAV):**此状态码提供多个独立操作的状态,用于WebDAV(Web分布式创作和版本控制),允许客户端在单个HTTP请求中发出多个请求。

  9. **208 Already Reported (WebDAV):**此状态码在DAV:propstat响应元素内部使用,以避免重复枚举与同一集合的多个绑定的内部成员,是特定于WebDAV的状态码。

  10. **226 IM Used (HTTP Delta encoding):**服务器已完成对资源的GET请求,响应是对当前实例应用一个或多个实例操作结果的表示。用于HTTP Delta编码,指示服务器已完成请求,且响应是对当前实例应用操作结果的表示。

3XX重定向

这些状态码表示用户代理需要采取进一步行动才能完成请求,有时所需行动可由用户代理在不与用户交互的情况下执行。

  1. 300 Multiple Choices:此状态码表示请求有多个可能的响应,用户代理或用户应从中选择一个。选择方法无标准化,建议使用HTML链接指向可能性,方便用户选择。

  2. 301 Moved Permanently:此状态码表示请求资源的URL已永久更改,新URL在响应中给出。常用于URL重定向,搜索引擎遇到此状态码时会更新指向资源的链接。

  3. 302 Found:此状态码表示请求资源的URI已临时更改,未来可能再次更改。因此,客户端在未来请求中应使用相同的URI。此状态码类似于301,但不允许将请求方法从POST更改为GET。

  4. 303 See Other:此状态码表示服务器将用户代理重定向到不同资源,如Location头中所示的URI,旨在为原始请求提供间接响应。主要用于允许POST操作的输出将用户代理重定向到选定资源。

  5. 304 Not Modified:此状态码用于缓存目的,告知客户端响应未被修改,客户端可继续使用相同的缓存响应版本,通常用于减少带宽使用。

  6. 305 Use Proxy:此状态码已不再使用,表示请求资源必须通过Location头中给出的代理进行访问。因代理的带内配置存在安全问题已被弃用。

  7. 307 Temporary Redirect:此状态码表示目标资源暂时位于不同的URI下,用户代理执行自动重定向到该URI时不得更改请求方法,类似于302,但不允许更改HTTP方法。

  8. 308 Permanent Redirect:此状态码表示目标资源已被分配新的永久URI,对该资源的任何未来引用应使用其中一个封闭的URIs,类似于301,但不允许更改HTTP方法。

4XX客户端错误

这些状态码适用于客户端出现错误的情况,表示请求包含错误语法或无法完成。

  1. 400 Bad Request:此状态码表示服务器因认为是客户端错误而无法或不会处理请求,可能是请求语法格式错误、请求消息框架无效或欺骗性请求路由。

  2. 401 Unauthorized:此状态码表示请求未被应用,因为缺少目标资源的有效身份验证凭据。生成401响应的服务器必须发送包含至少一个适用于目标资源的质询的WWW - Authenticate头字段。

  3. 403 Forbidden:此状态码表示服务器理解请求但拒绝授权,与401不同,重新进行身份验证无区别。访问被永久禁止且与应用程序逻辑相关,如对资源的权限不足。

  4. 404 Not Found:此状态码表示服务器找不到请求的资源。在浏览器中意味着URL未被识别,在API中也可能表示端点有效但资源不存在。服务器也可能发送此响应而非403,以向未授权客户端隐藏资源存在。

  5. 405 Method Not Allowed:此状态码表示服务器知道请求方法,但目标资源不支持该方法。例如,API可能禁止删除资源。

  6. 406 Not Acceptable:此状态码表示服务器无法生成与请求的主动内容协商头中定义的可接受值列表匹配的响应,通常在服务器不支持客户端请求的媒体类型时使用。

  7. 407 Proxy Authentication Required:此状态码类似于401,但表示客户端必须首先向代理进行身份验证。

  8. 408 Request Timeout:此状态码表示服务器在准备等待的时间内未收到完整的请求消息,客户端可在以后任何时间重复请求而无需修改。

  9. 409 Conflict:此状态码表示请求与目标资源的当前状态冲突,通常在上传比服务器上现有文件旧的文件的PUT请求中使用,导致版本控制冲突。

  10. 410 Gone:此状态码表示目标资源在源服务器上不再可用,且可能是永久的。若不确定情况是临时还是永久,应使用404状态码代替。

  11. 411 Length Required:此状态码表示服务器拒绝接受没有定义Content - Length头的请求。

  12. 412 Precondition Failed:此状态码表示请求头字段中给出的一个或多个条件在服务器上测试时评估为假。

  13. 413 Payload Too Large:此状态码表示服务器拒绝处理请求,因为请求有效负载大于服务器愿意或能够处理的大小,服务器可能会关闭连接以防止客户端继续请求。

  14. 414 URI Too Long:此状态码表示服务器拒绝服务请求,因为请求目标比服务器愿意解释的长度更长,可能发生在客户端将POST请求错误转换为带有长查询信息的GET请求时。

  15. 415 Unsupported Media Type:此状态码表示服务器拒绝服务请求,因为有效负载的格式不受目标资源上此方法的支持,通常发生在客户端发送服务器不支持的内容类型时。

  16. 416 Range Not Satisfiable:此状态码表示请求的Range头字段中的范围与所选资源的当前范围没有重叠,或因无效范围或过多请求小或重叠范围而拒绝请求的范围集。

  17. 417 Expectation Failed:此状态码表示请求的Expect头字段中给出的期望至少有一个入站服务器无法满足。

  18. 418 I'm a teapot:此代码在1998年作为传统的IETF愚人节笑话之一在RFC 2324"超文本咖啡壶控制协议"中定义,实际的HTTP服务器不期望实现它,通常用作网站中的复活节彩蛋。

  19. 421 Misdirected Request:此状态码表示请求被定向到无法生成响应的服务器,可由未配置为针对请求URI中包含的方案和权限组合生成响应的服务器发送。

  20. **422 Unprocessable Entity (WebDAV):**此状态码表示服务器理解请求实体的内容类型,且请求实体语法正确,但无法处理包含的指令。

  21. **423 Locked (WebDAV):**此状态码表示方法的源或目标资源被锁定。

  22. **424 Failed Dependency (WebDAV):**此状态码表示由于请求的操作依赖于另一个操作且该操作失败,因此无法在资源上执行该方法。

  23. 425 Too Early:此状态码表示服务器不愿意冒险处理可能被重放的请求。

  24. 426 Upgrade Required:此状态码表示服务器拒绝使用当前协议执行请求,但在客户端升级到不同协议后可能愿意执行。

  25. 428 Precondition Required:此状态码表示源服务器要求请求是有条件的。

  26. 429 Too Many Requests:此状态码表示用户在给定时间内发送了太多请求("速率限制"),通常用于防止滥用或服务器资源过载。

  27. 431 Request Header Fields Too Large:此状态码表示服务器不愿意处理请求,因为其头字段太大,可在减小请求头字段大小后重新提交请求。

  28. 451 Unavailable For Legal Reasons:此状态码表示服务器由于法律要求拒绝访问资源,所涉及的服务器可能不是源服务器,这种法律要求通常对ISP和搜索引擎运营影响最直接。

5XX服务器错误

这些状态码表示服务器未能完成有效请求,当服务器意识到遇到错误或无法执行请求时使用。

  1. 500 Internal Server Error:此状态码表示服务器遇到意外情况,阻止其完成请求,是通用错误消息,在遇到意外情况且无更具体消息合适时给出。

  2. 501 Not Implemented:此状态码表示服务器不支持完成请求所需的功能,当服务器不识别请求方法且无法为任何资源支持它时,是适当的响应。

  3. 502 Bad Gateway:此状态码表示服务器在充当网关或代理时,尝试完成请求时从访问的入站服务器收到无效响应,通常发生在上游服务关闭或不可达时。

  4. 503 Service Unavailable:此状态码表示服务器未准备好处理请求,常见原因是服务器因维护停机或过载。此响应应用于临时情况,若可能,Retry - After HTTP头应包含服务恢复的估计时间。

  5. 504 Gateway Timeout:此状态码表示服务器在充当网关或代理时,未及时从完成请求所需访问的上游服务器收到响应,通常发生在上游服务缓慢或无响应时。

  6. 505 HTTP Version Not Supported:此状态码表示服务器不支持或拒绝支持请求消息中使用的主要HTTP版本,可能发生在客户端使用服务器不支持的较新HTTP版本时。

  7. 506 Variant Also Negotiates:此状态码表示服务器有内部配置错误:所选的变体资源配置为自身进行透明内容协商,因此不是协商过程中的正确端点。

  8. **507 Insufficient Storage (WebDAV):**此状态码表示服务器无法存储完成请求所需的表示。

  9. **508 Loop Detected (WebDAV):**此状态码表示服务器在处理请求时检测到无限循环。

  10. 510 Not Extended:此状态码表示服务器需要对请求进行进一步扩展才能完成它。

  11. 511 Network Authentication Required:此状态码表示客户端需要进行身份验证才能获得网络访问权限,此状态不是由源服务器生成,而是由控制网络访问的拦截代理生成。

相关推荐
小满zs31 分钟前
React-router v7 第四章(路由传参)
前端·react.js
小陈同学呦40 分钟前
聊聊双列瀑布流
前端·javascript·面试
来自星星的坤1 小时前
SpringBoot 与 Vue3 实现前后端互联全解析
后端·ajax·前端框架·vue·springboot
AUGENSTERN_dc1 小时前
RaabitMQ 快速入门
java·后端·rabbitmq
键指江湖1 小时前
React 在组件间共享状态
前端·javascript·react.js
烛阴1 小时前
零基础必看!Express 项目 .env 配置,开发、测试、生产环境轻松搞定!
javascript·后端·express
诸葛亮的芭蕉扇2 小时前
D3路网图技术文档
前端·javascript·vue.js·microsoft
燃星cro2 小时前
参照Spring Boot后端框架实现序列化工具类
java·spring boot·后端
小离a_a2 小时前
小程序css实现容器内 数据滚动 无缝衔接 点击暂停
前端·css·小程序
徐小夕2 小时前
花了2个月时间研究了市面上的4款开源表格组件,崩溃了,决定自己写一款
前端·javascript·react.js