HTTP状态码是服务器用来告诉客户端,关于其HTTP请求的处理情况的编码。这些状态码被分为五类:
- 1xx(信息性状态码):表示接收的请求正在处理。
- 2xx(成功状态码):表示请求正常处理完毕。
- 3xx(重定向状态码):表示需要进行附加操作以完成请求。
- 4xx(客户端错误状态码):表示客户端请求有语法错误或请求无法实现。
- 5xx(服务器错误状态码):表示服务器执行请求的过程中发生了错误。
以下是一些常见的HTTP状态码及其含义:
HTTP状态码由三位数字组成,分为五个类别。以下列出了所有的HTTP状态码及其用途,但请注意,某些状态码是在HTTP/1.0和HTTP/1.1中定义的,而一些是后来的扩展,如由WebDAV和HTTP/2添加的状态码。
1xx - 信息性状态码
- 100 Continue: 客户端应继续其请求
- 101 Switching Protocols: 客户端请求服务器根据请求头中的Upgrade字段切换协议
- 102 Processing (WebDAV): 服务器已接受并正在处理请求,但无响应可用
- 103 Early Hints: 用于在服务器还未完全准备好响应时,提前返回响应头信息
2xx - 成功状态码
- 200 OK: 请求成功
- 201 Created: 请求成功并且服务器创建了新的资源
- 202 Accepted: 服务器已接受请求,但尚未处理
- 203 Non-Authoritative Information: 服务器已成功处理请求,但返回的信息可能来自另一来源
- 204 No Content: 服务器成功处理了请求,但没有返回任何内容
- 205 Reset Content: 服务器成功处理了请求,但没有返回任何内容,并且要求请求者重置文档视图
- 206 Partial Content: 服务器成功处理了部分GET请求
- 207 Multi-Status (WebDAV): 代表之后的消息体会是一个XML消息,并且可能依照之前的子请求数量包含多个独立的响应代码
- 208 Already Reported (WebDAV): 成员的内容已经在之前的多状态响应部分被枚举,且不会被再次列举
- 226 IM Used (HTTP Delta encoding): 服务器已经完成了对资源的GET请求,并且响应是对当前实例应用的一系列差异的表示
3xx - 重定向状态码
- 300 Multiple Choices: 请求有多种可能的响应
- 301 Moved Permanently: 请求的资源已永久移动到新位置
- 302 Found: 请求的资源现在临时从不同的URI响应请求
- 303 See Other: 对应当前请求的响应可以在另一个URI上被找到,并且应当使用GET方法获取
- 304 Not Modified: 自从上次请求后,请求的网页未修改过
- 305 Use Proxy (废弃): 请求者只能通过代理访问请求的网页
- 306 Switch Proxy (废弃): 在最新版的规范中,306状态码已经不再被使用
- 307 Temporary Redirect: 请求的资源现在临时从不同的URI响应请求
- 308 Permanent Redirect (RFC 7538): 请求的资源现在永久从另一个URI响应
4xx - 客户端错误状态码
- 400 Bad Request: 服务器不理解请求的语法
- 401 Unauthorized: 请求需要用户的认证
- 402 Payment Required (保留未用): 该状态码是为了将来可能的需求而保留的
- 403 Forbidden: 服务器拒绝请求
- 404 Not Found: 服务器找不到请求的网页
- 405 Method Not Allowed: 禁用请求中指定的方法
- 406 Not Acceptable: 无法使用请求的内容特性响应请求的网页
- 407 Proxy Authentication Required: 请求者应当使用代理进行授权
- 408 Request Timeout: 服务器等候请求时发生超时
- 409 Conflict: 请求与服务器当前的状态相冲突
- 410 Gone: 请求的资源已被永久删除
- 411 Length Required: 服务器不接受不含有效内容长度标头字段的请求
- 412 Precondition Failed: 服务器未满足请求者在请求中设置的其中一个前提条件
- 413 Payload Too Large: 请求实体过大
- 414 URI Too Long: 请求的URI过长,服务器无法处理
- 415 Unsupported Media Type: 请求的格式不受请求页面的支持
- 416 Range Not Satisfiable: 请求者请求的范围无效
- 417 Expectation Failed: 服务器无法满足Expect请求头字段的要求
- 418 I’m a teapot (HTCPCP): 超文本咖啡壶控制协议下,服务器拒绝冲泡咖啡因为是茶壶
- 421 Misdirected Request (HTTP/2): 请求针对的是无法产生响应的服务器
- 422 Unprocessable Entity (WebDAV): 请求格式正确,但是由于含有语义错误,无法响应
- 423 Locked (WebDAV): 资源被锁定
- 424 Failed Dependency (WebDAV): 由于之前的请求失败,导致当前请求失败
- 425 Too Early: 服务器不愿意风险进行处理可能重复的请求
- 426 Upgrade Required: 客户端应当切换到TLS/1.0
- 428 Precondition Required: 原服务器要求该请求是有条件的
- 429 Too Many Requests: 用户在给定的时间内发送了太多的请求
- 431 Request Header Fields Too Large: 服务器不愿意处理请求,因为头字段过大
- 451 Unavailable For Legal Reasons: 用户请求的资源非法
5xx - 服务器错误状态码
- 500 Internal Server Error: 服务器遇到了一个未曾预料到的情况,无法完成客户的请求
- 501 Not Implemented: 服务器不支持当前请求所需要的某个功能
- 502 Bad Gateway: 作为网关或代理工作的服务器从上游服务器收到无效响应
- 503 Service Unavailable: 目前无法使用服务器(由于超载或停机维护)
- 504 Gateway Timeout: 作为网关或代理的服务器,未及时从上游服务器接收请求
- 505 HTTP Version Not Supported: 服务器不支持请求中所用的HTTP协议版本
- 506 Variant Also Negotiates: 服务器存在内部配置错误
- 507 Insufficient Storage (WebDAV): 服务器无法存储完成请求所必须的内容
- 508 Loop Detected (WebDAV): 服务器在处理请求时检测到无限循环
- 510 Not Extended: 获取资源所需要的策略并没有被满足
- 511 Network Authentication Required: 客户端需要进行身份验证才能获取网络访问权限
请注意,并非所有状态码都被广泛使用或支持。例如,一些状态码可能只在某些特定的HTTP扩展中定义,如WebDAV。而某些状态码如418 I'm a teapot
是实验性的或不太正式的。上述列表基于RFC 7231和其他一些RFCs中定义的状态码。
深入解析与源码
HTTP状态码的处理通常在Web服务器软件中实现,如Apache、Nginx或其他HTTP服务器。服务器会根据处理请求的结果返回相应的状态码。例如,当请求的资源找不到时,服务器会返回404状态码。
下面我们看一个简单的示例,展示如何在使用Node.js的HTTP服务器中处理和返回状态码。
首先,安装Node.js环境,并创建一个文件server.js
:
const http = require('http');
const server = http.createServer((req, res) => {
const { pathname } = new URL(req.url, `http://${req.headers.host}`);
// 根据请求的URL路径返回不同的状态码
switch(pathname) {
case '/':
res.statusCode = 200;
res.end('Home Page');
break;
case '/about':
res.statusCode = 200;
res.end('About Page');
break;
default:
// 对于未知路径,返回404 Not Found
res.statusCode = 404;
res.end('404 Not Found');
}
});
server.listen(3000, () => {
console.log('Server running at http://localhost:3000/');
});
在这个例子中,创建了一个简单的HTTP服务器,它会监听3000端口的请求。服务器会检查请求的URL路径,如果是/
或/about
,则返回状态码200(OK),以及相应的页面内容。对于所有其他路径,服务器会返回404状态码(Not Found)和相应的文本消息。
要运行这个服务器,先在命令行中进入包含server.js
文件的目录,然后执行node server.js
命令。之后,通过浏览器访问http://localhost:3000/
、http://localhost:3000/about
以及任何其他非定义路径,观察不同的状态码和响应。
总结
在实际的Web开发过程中,正确使用HTTP状态码对于构建良好的HTTP通信非常重要。它们有助于客户端(如浏览器)理解请求的结果以及如何处理这些结果。大多数Web框架和服务器软件都提供了对这些状态码的支持,允许开发者根据业务逻辑需要返回合适的状态码。