🗒️status line
response 报文的 start line
Last updated
response 报文的 start line
Last updated
表示服务器响应的状态,比如 HTTP/1.1 200 OK
version
版本号
报文使用的 HTTP 协议版本
status code
状态码
一个三位数,表示响应的处理结果 比如 200 是成功,500 是服务器错误
reason
原因短语
是对 status code 的简短文字描述 但其早期只是为了兼容不同的文本客户端,而且提供的信息很有限,目前大多数客户端都会忽略它
status code(状态码)表示服务器对请求的处理结果,客户端可以依据它适时转换处理状态,比如继续发送请求、切换协议,重定向跳转等,有那么点 TCP 状态转换的意思。
目前 RFC 标准里规定的状态码是三位数,所以取值范围就是从 000 到 999。考虑到灵活性和可扩展性,状态码用数字的第一位表示分类:
1××
提示信息
表示目前是协议处理的中间状态 实际用到的很少
2××
成功
报文已经收到并被正确处理
3××
重定向
表示客户端请求的资源发生了变动 客户端必须使用新的 URI 重新发送请求获取资源
4××
客户端错误
请求报文有误,服务器无法处理
5××
服务器错误
服务器在处理请求时内部发生了错误
在 HTTP 协议中,正确地理解并应用这些状态码不是客户端或服务器单方的责任,而是双方共同的责任。
目前 RFC 标准里总共有 41 个状态码,但状态码的定义是开放的,允许自行扩展。所以 Apache、Nginx 等 Web 服务器都定义了一些专有的状态码。
100
Continue
继续。客户端应继续其请求
101
Switching Protocols
切换(到更高级的)协议。服务器根据客户端的请求切换协议,比如切换到 HTTP 的新版本协议,比如用 Upgrade 头字段切换到 WebSocket 协议
200
OK
请求成功。一般用于 GET 与 POST 请求,会返回请求所要的响应头和数据,即全量数据。
201
Created
已创建。成功请求并创建了新的资源
202
Accepted
已接受。已经接受请求,但未处理完成
203
Non-Authoritative Information
非授权信息。请求成功,但返回的 meta 信息不在原始的服务器,而是一个副本
204
No Content
含义与 200 基本相同,只是没有 body 数据。比如在未更新网页的情况下,可确保浏览器继续显示当前文档
205
Reset Content
重置内容。服务器处理成功,用户终端(如浏览器)应重置文档视图,可通过此返回码清除浏览器的表单域
206
Partial Content
部分内容。在客户端发送“范围请求”、要求获取资源的部分数据时出现,是 HTTP 分块下载或断点续传的基础。它与 200 一样,也是服务器成功处理了请求,只是 body 里的数据不是资源的全部,通常伴随着头字段 Content-Range
300
Multiple Choices
多种选择。请求的资源可包括多个位置,相应可返回一个资源特征与地址的列表用于客户端选择
301
Moved Permanently
永久移动(永久重定向)。表示请求的资源已经不存在了,需要换成新 URI 再次访问,其中新 URI 通过响应头里的 Location 指定,值可能是多个。此时,浏览器会自动定向到新 URI,今后任何新的请求都应使用新的 URI 代替。如果可能,拥有链接编辑功能的客户端应当自动把请求的地址修改为从服务器反馈回来的地址。除非额外指定,否则这个响应也是可缓存的(即 301 会触发缓存优化)
302
Found
临时移动(临时重定向)。意思是请求的资源还在,但需要暂时用另一个 URI 来访问。只有指定了 Cache-Control
或 Expires
的情况下,该响应才是可缓存的。
303
See Other
查看其它地址。与 301 类似,使用 GET 和 POST 请求查看
304
Not Modified
表示资源未修改,通常与 If-Modified-Since 等条件请求一起,用于缓存控制。它不具有通常意义上的跳转含义,但可以理解成重定向已到缓存的文件,缓存重定向
305
Use Proxy
使用代理。所请求的资源必须通过代理访问
306
Unused
已经被废弃的 HTTP 状态码
307
Temporary Redirect
临时重定向。与 302 类似,使用 GET 请求重定向
308
应用场景:
资源不可用:需要用另一个新的 URI 来代替,比如域名变更、服务器变更、网站改版、系统维护
避免重复:让多个网址都跳转到一个 URI,增加访问入口的同时还不会增加额外的工作量。比如有的网站都会申请多个名称类似的域名,然后把它们再重定向到主站上
永久 vs 临时:
永久:如果域名、服务器、网站架构发生了大幅度的改变,比如启用了新域名、服务器切换到了新机房、网站目录层次重构
临时:比如系统维护,把网站重定向到一个通知页面,告诉用户过一会儿再来访问。比如服务降级,在双十一时,把订单查询、领积分等不重要的功能入口暂时关闭,保证核心服务能够正常运行
4×× 类状态码表示客户端发送的请求报文有误,服务器无法处理。它是真正意义上的“错误码”。
400
Bad Request
客户端请求的语法错误,服务器无法理解。比如数据类型不匹配,比如应该是 JSON 字符串却传了对象,比如字段名称和字段类型不一致。(待确认??) 是一个通用的错误码。应当尽量避免给客户端返回 400,而是换作其它更有明确含义的状态码。
401
Unauthorized
请求要求用户的身份认证。当前请求需要用户验证
402
Payment Required
保留,为将来使用
403
Forbidden
实际上不是客户端的请求出错,而是服务器禁止访问资源。原因可能多种多样,比如信息敏感、法律禁止等,如果服务器友好一点,可以在 body 里详细说明拒绝请求的原因
404
Not Found
服务器无法根据客户端的请求找到资源(网页)。通过此代码,网站设计人员可设置“您所请求的资源无法找到”的个性页面
405
Method Not Allowed
不允许使用某些方法操作资源,比如不允许 POST 只能 GET;
406
Not Acceptable
资源无法满足客户端请求的条件,比如请求中文但只有英文
407
Proxy Authentication Required
请求要求代理的身份认证,与 401 类似,但请求者应当使用代理进行授权
408
Request Time-out
请求超时,服务器等待了过长的时间
409
Conflict
多个请求发生了冲突,可以理解为多线程并发时的竞态
410
Gone
客户端请求的资源已经不存在。410 不同于 404,如果资源以前有现在被永久删除了可使用 410 代码,网站设计人员可通过 301 代码指定资源的新位置
411
Length Required
服务器无法处理客户端发送的不带 Content-Length 的请求信息
412
Precondition Failed
客户端请求信息的先决条件错误
413
Request Entity Too Large
请求报文里的 body 太大,服务器无法处理。为防止客户端的连续请求,服务器可能会关闭连接。如果只是服务器暂时无法处理,则会包含一个 Retry-After 的响应信息
414
Request-URI Too Large
请求行里的 URI 过长,服务器无法处理
415
Unsupported Media Type
服务器无法处理请求附带的媒体格式
416
Requested range not satisfiable
客户端请求的范围无效
417
Expectation Failed
服务器无法满足 Expect 的请求头信息
429
Too Many Requests
客户端发送了太多的请求,通常是由于服务器的限连策略
431
Request Header Fields Too Large
请求头某个字段或总体太大
5×× 类状态码表示客户端请求报文正确,但服务器在处理时内部发生了错误,导致无法返回应有的响应数据。
500
Internal Server Error
与 400 类似,也是一个通用的错误码。服务器究竟发生了什么错误我们不知道。不过对于服务器来说,这应该算是好事,通常不应该把服务器内部的详细信息告诉外界。
501
Not Implemented
表示客户端请求的功能还不支持。类似“即将开业,敬请期待”
502
Bad Gateway
通常是服务器作为网关或者代理时返回的错误码,表示服务器自身工作正常,访问后端服务器时发生了错误,但具体的错误原因也是不知道的
503
Service Unavailable
表示服务器当前很忙,暂时无法响应服务,我们上网时有时候遇到的“网络服务正忙,请稍后重试”的提示信息就是 503。503 通常是个临时的状态,很可能过几秒钟后服务器就不那么忙了,可以继续提供服务,所以 503 响应报文里通常还会有一个 Retry-After 字段,指示客户端可以在多久以后再次尝试发送请求。
504
Gateway Time-out
充当网关或代理的服务器,未及时从远端服务器获取请求
505
HTTP Version not supported
服务器不支持请求的 HTTP 协议的版本,无法完成处理