TIPS
文章出处:
# 状态码是什么
HTTP状态码(英语:HTTP Status Code),用以表示网页服务器超文本传输协议响应状态的3位数字代码。它由RFC 2616规范定义的,并得到RFC 2518、RFC 2817、RFC 2295、RFC 2774与RFC 4918等规范扩展。简单来讲,HTTP状态码的作用是服务器告诉客户端当前请求响应的状态,通过状态码就能判断和分析服务器的运行状态。
# 状态码分类
状态码第一位数字决定了不同的响应状态,有如下:
- 1:表示消息。
- 2:表示成功。
- 3:表示重定向。
- 4:表示请求错误。
- 5:表示服务器错误。
# 1xx
代表请求已被接受,需要继续处理。这类响应是临时响应,只包含状态行和某些可选的响应头信息,并以空行结束。常见的有:
- 100(客户端继续发送请求,这是临时响应):这个临时响应是用来通知客户端它的部分请求已经被服务器接收,且仍未被拒绝。客户端应当继续发送请求的剩余部分,或者如果请求已经完成,忽略这个响应。服务器必须在请求完成后向客户端发送一个最终响应。
- 101:服务器根据客户端的请求切换协议,主要用于websocket或http2升级。
# 2xx
代表请求已成功被服务器接收、理解、并接受。常见的有:
- 200(成功):请求已成功,请求所希望的响应头或数据体将随此响应返回。
- 201(已创建):请求成功并且服务器创建了新的资源。
- 202(已创建):服务器已经接收请求,但尚未处理。
- 203(非授权信息):服务器已成功处理请求,但返回的信息可能来自另一来源。
- 204(无内容):服务器成功处理请求,但没有返回任何内容。
- 205(重置内容):服务器成功处理请求,但没有返回任何内容。
- 206(部分内容):服务器成功处理了部分请求。
# 3xx
表示要完成请求,需要进一步操作。通常,这些状态代码用来重定向。常见的有:
300(多种选择):针对请求,服务器可执行多种操作。服务器可根据请求者(user agent)选择一项操作,或提供操作列表供请求者选择。
301(永久移动):请求的网页已永久移动到新位置。服务器返回此响应(对GET或HEAD请求的响应)时,会自动将请求者转到新位置。
302(临时移动):服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。
303(查看其他位置):请求者应当对不同的位置使用单独的GET请求来检索响应时,服务器返回此代码。
304(协商缓存):请求命中协商缓存。
305(使用代理):请求者只能使用代理访问请求的网页。如果服务器返回此响应,还表示请求者应使用代理。
307(Temporary临时重定向):服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。
308(Permanent永久重定向):请求的网页已永久移动到新位置。
301、308是永久改变地址;302/303、307是临时改变地址。
301、302允许改变请求方法(post会改get);308、307不允许改变请求方法(post方法还是post方法)。
注:永久(Permanent)和临时(Temporary)的区别:永久是指原来访问的资源已经永久删除啦,客户端应该根据新的URI访问重定向。临时是指访问的资源可能暂时先用location的URI访问,但旧资源还在的,下次你再来访问的时候可能就不用重定向了。
# 4xx
代表了客户端看起来可能发生了错误,妨碍了服务器的处理。常见的有:
- 400(错误请求):服务器不理解请求的语法。
- 401(未授权Unauthorized):请求要求身份验证。对于需要登录的网页,服务器可能返回此响应。
- 403(禁止Forbidden):服务器端有能力处理该请求,但是拒绝授权访问。
- 404(未找到Not Found):服务器找不到请求的网页。
- 405(方法禁用Method Not Allowed):禁用请求中指定的方法。
- 406(不接受):无法使用请求的内容特性响应请求的网页。
- 407(需要代理授权):此状态代码与401(未授权)类似,但指定请求者应当授权使用代理。
- 408(请求超时Request Timeout):服务器等候请求时发生超时。
- 429(请求过多Too Many Requests):客户端在一定时间内发送了过多的请求,超出了服务器的限制。
# 5xx
表示服务器无法完成明显有效的请求。这类状态码代表了服务器在处理请求的过程中有错误或者异常状态发生。常见的有:
- 500(服务器内部错误):服务器遇到错误,无法完成请求。
- 501(尚未实施):请求的方法不被服务器支持,因此无法被处理。服务器必须支持的方法(即不会返回这个状态码的方法)只有
GET和HEAD。 - 502(错误网关):服务器作为网关或代理,从上游服务器收到无效响应。
- 503(服务不可用):服务器目前无法使用(由于超载或停机维护)。
- 504(网关超时):服务器作为网关或代理,但是没有及时从上游服务器收到请求。
- 505(HTTP版本不受支持):服务器不支持请求中所用的HTTP协议版本。
# 状态码适用场景
下面给出一些状态码的适用场景:
- 100:客户端在发送POST数据给服务器前,征询服务器情况,看服务器是否处理POST的数据,如果不处理,客户端则不上传POST数据,如果处理,则POST上传数据。常用于POST大数据传输。
- 206:一般用来做断点续传,或者是视频文件等大文件的加载。
- 301:永久重定向会缓存。新域名替换旧域名,旧的域名不再使用时,用户访问旧域名时用301就重定向到新的域名。
- 302:临时重定向不会缓存,常用于未登陆的用户访问用户中心重定向到登录页面。
- 304:协商缓存,告诉客户端有缓存,直接使用缓存中的数据,返回页面的只有头部信息,是没有内容部分。
- 400:参数有误,请求无法被服务器识别。
- 403:告诉客户端禁止访问该站点或者资源,如在外网环境下,然后访问只有内网IP才能访问的时候则返回。
- 404:服务器找不到资源时,或者服务器拒绝请求又不想说明理由时。
- 503:服务器停机维护时,主动用503响应请求或nginx设置限速,超过限速,会返回503。
- 504:网关超时。
# 请求头是什么
HTTP头字段(HTTP header fields),是指在超文本传输协议(HTTP)的请求和响应消息中的消息头部分。它们定义了一个超文本传输协议事务中的操作参数。HTTP头部字段可以自己根据需要定义,因此可能在Web服务器和浏览器上发现非标准的头字段。
下面是一个HTTP请求的请求头:
GET /home.html HTTP/1.1
Host: developer.mozilla.org
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:50.0) Gecko/20100101 Firefox/50.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Referer: https://developer.mozilla.org/testpage.html
Connection: keep-alive
Upgrade-Insecure-Requests: 1
If-Modified-Since: Mon, 18 Jul 2016 02:36:04 GMT
If-None-Match: "c561c68d0ba92bbeb8b0fff2a9199f722e3a621a"
Cache-Control: max-age=0
2
3
4
5
6
7
8
9
10
11
12
# 请求头分类
常见的请求字段如下表所示:
| 字段名 | 说明 | 示例 |
|---|---|---|
| Accept | 能够接受的回应内容类型(Content-Types) | Accept: text/plain |
| Accept-Charset | 能够接受的字符集 | Accept-Charset: utf-8 |
| Accept-Encoding | 能够接受的编码方式列表 | Accept-Encoding: gzip, deflate |
| Accept-Language | 能够接受的回应内容的自然语言列表 | Accept-Language: en-US |
| Authorization | 用于超文本传输协议的认证的认证信息 | Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ== |
| Cache-Control | 用来指定在这次的请求/响应链中的所有缓存机制都必须遵守的指令 | Cache-Control: no-cache |
| Connection | 该浏览器想要优先使用的连接类型 | Connection: keep-alive Connection: Upgrade |
| Cookie | 服务器通过 Set-Cookie(下文详述)发送的一个超文本传输协议Cookie | Cookie: $Version=1; Skin=new |
| Content-Length | 以八位字节数组(8位的字节)表示的请求体的长度 | Content-Length: 348 |
| Content-Type | 请求体的多媒体类型 | Content-Type: application/x-www-form-urlencoded |
| Date | 发送该消息的日期和时间 | Date: Tue, 15 Nov 1994 08:12:31 GMT |
| Expect | 表明客户端要求服务器做出特定的行为 | Expect: 100-continue |
| Host | 服务器的域名(用于虚拟主机),以及服务器所监听的传输控制协议端口号 | Host: en.wikipedia.org:80 Host: en.wikipedia.org |
| If-Match | 仅当客户端提供的实体与服务器上对应的实体相匹配时,才进行对应的操作。主要作用时,用作像 PUT 这样的方法中,仅当从用户上次更新某个资源以来,该资源未被修改的情况下,才更新该资源 | If-Match: "737060cd8c284d8af7ad3082f209582d" |
| If-Modified-Since | 允许在对应的内容未被修改的情况下返回304未修改 | If-Modified-Since: Sat, 29 Oct 1994 19:43:31 GMT |
| If-None-Match | 允许在对应的内容未被修改的情况下返回304未修改 | If-None-Match: "737060cd8c284d8af7ad3082f209582d" |
| If-Range | 如果该实体未被修改过,则向我发送我所缺少的那一个或多个部分;否则,发送整个新的实体 | If-Range: "737060cd8c284d8af7ad3082f209582d" |
| Range | 仅请求某个实体的一部分 | Range: bytes=500-999 |
| User-Agent | 浏览器的浏览器身份标识字符串 | User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:12.0) Gecko/20100101 Firefox/21.0 |
| Origin | 发起一个针对跨来源资源共享的请求 | Origin: http://www.example-social-network.com |
# 请求头使用场景
通过配合请求头和响应头,可以满足一些场景的功能实现:
# 协商缓存
协商缓存是利用的是【Last-Modified,If-Modified-Since】和【ETag、If-None-Match】这两对请求头响应头来管理的。
Last-Modified表示本地文件最后修改日期,浏览器会在request header加上If-Modified-Since(上次返回的Last-Modified的值),询问服务器在该日期后资源是否有更新,有更新的话就会将新的资源发送回来。
Etag就像一个指纹,资源变化都会导致ETag变化,跟最后修改时间没有关系,ETag可以保证每一个资源是唯一的。
If-None-Match的header会将上次返回的Etag发送给服务器,询问该资源的Etag是否有更新,有变动就会发送新的资源回来。
而强制缓存不需要发送请求到服务端,根据请求头expires和cache-control判断是否命中强缓存。
# 会话状态
cookie,类型为「小型文本文件」,指某些网站为了辨别用户身份而储存在用户本地终端上的数据,通过响应头set-cookie决定。作为一段一般不超过4KB的小型文本数据,它由一个名称(Name)、一个值(Value)和其它几个用于控制cookie有效期、安全性、使用范围的可选属性组成。
cookie主要用于以下三个方面:
- 会话状态管理(如用户登录状态、购物车、游戏分数或其它需要记录的信息)。
- 个性化设置(如用户自定义设置、主题等)。
- 浏览器行为跟踪(如跟踪分析用户行为等。