RFC 标准把状态码分成了五类,用数字的第一位表示分类。从 100-599
- 1xx:提示信息,表示目前是协议处理的中间状态,还需后续的操作
- 2xx:成功,报文已经收到并被正确处理
- 3xx:重定向,资源位置发生变动,需要客户端重新发生请求
- 4xx:客户端错误,请求报文有误,服务器无法处理
- 5xx:服务器错误,服务器再处理请求时内部发生了错误
1xx
1xx 类状态码属于提示信息,是协议处理的中间状态,实际能够用到的时候很少。
- "101 Switching Protocols" 意思是客户端使用 Upgrade 头字段,要求在 HTTP 协议的基础上改成其他的协议继续通信,比如 WebSocket。而如果服务器也同意变更协议,就会发送状态码 101,但这之后的传输就不会再使用 HTTP 了。
2xx
2xx 类状态码表示服务器收到并成功处理了客户端请求。
-
"200 OK" 表示处理成功,如果是非 HEAD 请求,通常在响应头后都会有 body 数据。
-
"204 No Content" 与 状态码 200 含义基本相同,但是响应头后没有 body 数据。
-
"206 Partial Content" 是 HTTP 分块下载或断点续传的基础,在客户端发送“范围请求”、要求获取资源的部分数据时出现。也是表示服务器成功处理请求,但 body 里的数据不是资源的全部,而是其中的一部分。
状态码 206 通常还会伴随着头字段 “Content-Range” ,表示响应报文里 body 数据的具体范围,供客户端确认。例如 “Content-Range: bytes 0-99/2000”,表示此次获取的是总计 2000 个字节的前 100 个字节。
3xx
3xx 类状态码表示客户端请求的资源发生了变动,客户端必须用新的 URI 重新发送请求获取资源。
-
"301 Moved Permanently" 俗称“永久重定向”,含义是此次请求的资源已经不存在了,需要改用新的 URI 再次访问。
-
"302 Found" 俗称“临时重定向”,意思是请求的资源还在,但暂时需要另一个 URI 来访问。
两者的根本区别在于语义,一个是“永久”,一个是“临时”。
比如,网站升级到了 HTTPS,原来的 HTTP 不用了,这就是“永久”的。
? 晚上网站后台要系统维护,服务暂时不可用,这就属于“临时”的,可以配置成 302 跳转,把流量临时切换到静态通知页面,浏览器看到这个 302 就知道是暂时的情况,不会做缓存优化。
-
"304 Not Modified" 用于 If-Modified-Since 等条件请求,表示资源未修改,用于缓存控制。
4xx
4xx 类状态码表示客户端发送的请求报文有误,服务器无法处理。
- "400 Bad Request" 是一个通用的错误码,表示请求报文有误。
- "403 Forbidden" 表示服务器禁止访问资源。
- "404 Not Found" 表示资源未找到
5xx
5xx 类状态码表示客户端请求报文正确,但服务器在处理时内部发生了错误,无法返回应有的响应数据。
- "500 Internal Server Error" 通用错误码,表示服务器发生错误。