HTTP状态码
100~200
100(continue)
信息型状态响应码。表示目前为止一切正常,客户端应该继续请求,如果已完成请求则忽略。
为了让服务器检查请求的首部, 客户端必须在发送请求实体前, 在初始化请求中发送 Expect: 100-continue
首部并接收 100 Continue
响应状态码。
101(Switch Protocol)
协议切换状态码表示服务器应客户端升级协议的请求正在进行协议切换
服务器会发送一个Upgrade应答头来表示其正在切换过去的协议。 示例:
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
200~300
200(ok)
状态码 200 OK
表明请求已经成功. 默认情况下成功的请求将会被缓存
不同请求方式对于请求成功的意义如下:
- GET: 已经取得资源,并将资源添加到响应中的消息体.
- HEAD: 作为消息体的头部信息
- POST: 在消息体中描述此次请求的结果.
- TRACE: 响应的消息体包含服务器接收到的请求信息.
请求成功对于 PUT
和 DELETE
来说并不是 200 ok
而是 204
所代表的没有资源, 或者 201
所代表的当一个资源首次被创建成功
201(created)
代表成功的应答状态码,表示请求已经被成功处理,并且创建了新的资源。新的资源在应答返回之前已经被创建。同时新增的资源会在应答消息体中返回,其地址或者是原始请求的路径,或者是 Location
首部的值。
这个状态码的常规使用场景是作为 PUT
请求的返回值。
202(accepted)
响应状态码 202 Accepted
表示服务器端已经收到请求消息,但是尚未进行处理。但是对于请求的处理无法保证的,即稍后无法通过 HTTP
协议给客户端发送一个异步请求来告知其请求的处理结果。这个状态码被设计用来将请求交由另外一个进程或者服务器来进行处理,或者是对请求进行批处理的情形。
203(non-authoritative information)
表示请求已经成功被响应,但是获得的负载与源头服务器的状态码为 200 (OK)
的响应相比,经过了拥有转换功能的 proxy
(代理服务器)的修改。
203
状态码有点类似于 Warning
首部的 214(Transformation Applied)
警告码,后者的优势在于可以应用于任何状态码的响应之中。
204(no content)
表示目前请求成功,但客户端不需要更新其现有页面。 204
响应默认是可以被缓存的。在响应中需要包含头信息 ETag
。
使用惯例是,在 PUT
请求中,更新资源,但是不需要改变当前展示给用户的页面,则返回 204 No Content
。如果新创建了资源,那么返回 201 Created
。如果页面需要更新以反映更新后的资源,那么需要返回 200
。
205(reset content)
通知客户端重置文档视图,比如清空表单内容、重置 canvas
状态或者刷新用户界面。
206(partial content)
表示请求已成功,并且主体包含所请求的数据区间,该数据区间是在请求的 Range
首部指定的。
如果只包含一个数据区间,那么整个响应的 Content-Type
首部的值为所请求的文件的类型,同时包含 Content-Range
首部。
如果包含多个数据区间,那么整个响应的 Content-Type
首部的值为 multipart/byteranges
,其中一个片段对应一个数据区间,并提供 Content-Range
和 Content-Type
描述信息。 示例:
只包含一个数据区间的响应:
HTTP/1.1 206 Partial Content
Date: Wed, 15 Nov 2015 06:25:24 GMT
Last-Modified: Wed, 15 Nov 2015 04:58:08 GMT
Content-Range: bytes 21010-47021/47022
Content-Length: 26012
Content-Type: image/gif
... 26012 bytes of partial image data ...
包含多个数据区间的响应:
HTTP/1.1 206 Partial Content
Date: Wed, 15 Nov 2015 06:25:24 GMT
Last-Modified: Wed, 15 Nov 2015 04:58:08 GMT
Content-Length: 1741
Content-Type: multipart/byteranges; boundary=String_separator
--String_separator
Content-Type: application/pdf
Content-Range: bytes 234-639/8000
...the first range...
--String_separator
Content-Type: application/pdf
Content-Range: bytes 4590-7999/8000
...the second range
--String_separator--
300~400
300(multiple choices)
表示重定向的响应状态码,表示该请求拥有多种可能的响应。用户代理或者用户自身应该从中选择一个。由于没有如何进行选择的标准方法,这个状态码极少使用。
假如服务器可以提供一个优先选择,那么它应该生成一个 Location
首部。
301(moved permanently)
永久重定向,说明请求的资源已经被移动到了由 Location
头部指定的 url
上,是固定的不会再改变。搜索引擎会根据该响应修正。
尽管标准要求浏览器在收到该响应并进行重定向时不应该修改 http method
和 body
,但是有一些浏览器可能会有问题。所以最好是在应对GET
或 HEAD
方法时使用 301
,其他情况使用 308
来替代 301
。
302(found)
重定向状态码表明请求的资源被 暂时 的移动到了由Location 头部指定的url上。一个浏览器会重定向到这个URL, 但是搜索引擎不应该更新到这个资源的URL。
即使标准要求浏览器在重定向时保证 http method
和 body
不变,但是一些浏览器可能会有问题,所以推荐在应对 GET
或 HEAD
时使用302,其他情况使用307 来代替302。
303(see other)
使用其他方法,通常是作为 PUT
或 POST
操作的响应,说明响应不是刚刚上传的资源而是一个确认信息或一个上传正在处理的页面。 http method
通常会改变为 GET
。
304(not modified)
未改变说明无需再次传输请求的内容,也就是说可以使用缓存的内容。这通常是在一些安全的方法(safe
),例如GET 或HEAD 或在请求中附带了头部信息: If-None-Match
或 If-Modified-Since
。
307(temporary redirect)
临时重定向说明请求的资源暂时地被移动到 Location
头部所指示的 url
上。浏览器会重定向,但是搜索引擎不会更新。
在重定向过程中,原请求的 http method
和 body
是不可变的。和302的不同就是确保 http method
和 body
不会改变。
308(permanent redirect)
永久重定向 说明请求的资源已经被永久的移动到了由 Location
头部指定的 url
上。浏览器会进行重定向,同时搜索引擎也会更新。
在重定向过程中 request method
和 body
不会改变。
400~500
400(bad request)
表示由于语法无效,服务器无法理解该请求。 客户端不应该在未经修改的情况下重复此请求。
401(unauthorized)
代表客户端错误,指的是由于缺乏目标资源要求的身份验证凭证,发送的请求未得到满足。
这个状态码会与 WWW-Authenticate
首部一起发送,其中包含有如何进行验证的信息。
这个状态类似于 403
, 但是在该情况下,依然可以进行身份验证。 示例:
HTTP/1.1 401 Unauthorized
Date: Wed, 21 Oct 2015 07:28:00 GMT
WWW-Authenticate: Basic realm="Access to staging site"
403(forbidden)
代表客户端错误,指的是服务器端有能力处理该请求,但是拒绝授权访问。
这个状态类似于 401,但是进入该状态后,不能再继续进行验证。该访问是永久禁止的,并且与应用逻辑密切相关(例如不正确的密码)。
404(not found)
代表客户端错误,指的是服务器端无法找到所请求的资源。由于它的频繁出现,这个状态码估计是最著名的一个了。返回该响应的链接通常称为坏链(broken link)
或死链(dead link)
,它们会导向链接出错处理(link rot)
页面。
404 状态码并不能说明该缺失是临时的还是永久的。如果服务器知道这种情况极有可能是永久的,那么应该返回 410 (Gone) 而不是 404 。
405(method not allowed)
表明服务器禁止了使用当前 HTTP 方法的请求。需要注意的是,GET 与 HEAD 两个方法不得被禁止,当然也不得返回状态码 405。
406(not acceptable)
表示客户端错误,指代服务器端无法提供与 Accept-Charset
以及 Accept-Language
消息头指定的值相匹配的响应。
在实际应用中,这个错误状态码极少使用:不是给用户返回一个晦涩难懂(且难以更正)的错误状态码,而是将相关的消息头忽略,同时给用户提供一个看得见摸得着的页面。这种做法基于这样一个假设:即便是不能达到用户十分满意,也强于返回错误状态码。
如果服务器返回了这个错误状态码,那么消息体中应该包含所能提供的资源表现形式的列表,允许用户手动进行选择。
407(proxy authentication required)
代表客户端错误,指的是由于缺乏位于浏览器与可以访问所请求资源的服务器之间的代理服务器(proxy server )
要求的身份验证凭证,发送的请求尚未得到满足。
这个状态码会与 Proxy-Authenticate
首部一起发送,其中包含有如何进行验证的信息。 示例:
HTTP/1.1 407 Proxy Authentication Required
Date: Wed, 21 Oct 2015 07:28:00 GMT
Proxy-Authenticate: Basic realm="Access to internal site"
408(request timeout)
表示服务器想要将没有在使用的连接关闭。一些服务器会在空闲连接上发送此信息,即便是在客户端没有发送任何请求的情况下。
服务器应该在此类响应中将 Connection
首部的值设置为 "close"
,因为 408 意味着服务器已经决定将连接关闭,而不是继续等待。
这类响应出现的比较频繁,源于一些浏览器——例如 Chrome, Firefox 27+
, 或者 IE9 等——使用 HTTP 协议中的预连接机制来加速上网体验。同时应该注意到,某些服务器会直接关闭连接,而不发送此类消息。
409(conflict)
表示请求与当前服务器端的状态相冲突。
冲突最有可能发生在对 PUT 请求的响应中。例如,当上传文件的版本比服务器上已存在的要旧,从而导致版本冲突的时候,那么就有可能收到状态码为 409 的响应。
410(gone)
说明请求的内容在服务器上不存在了,同时是永久性的丢失。如果不清楚是否为永久或临时的丢失,应该使用404
411(length required)
表示由于缺少确定的 Content-Length
首部字段,服务器拒绝客户端的请求。
注意,按照规范,当使用分块模式传输数据的时候, Content-Length
首部是不存在的,但是需要在每一个分块的开始添加该分块的长度,用十六进制数字表示。参见 Transfer-Encoding
获取更多细节信息。
412(precondition failed)
表示对目标资源的访问已被拒绝。 这种情况通常发生在方法的条件请求上比如 GET 或者 HEAD 当通过设置If-Unmodified-Since
或者If-None-Match
的头部未完成的条件的时候. 这种情况下, 请求通常要对资源做出上传或者修改操作, 但是并不能这样做并且服务器会响应这个状态码。
413(payload too large)
表示请求主体的大小超过了服务器规定的限度,服务器可以选择关闭连接或者返回 Retry-After
首部字段。
414(url too long)
表示客户端所请求的 URI 超过了服务器允许的范围。
以下是造成这种罕见情况的几种可能的原因:
- 当客户端误将 POST 请求当作 GET 请求的时候,会带有一个长长的查询字符串(query);
- when the client has descended into a loop of redirection (for example, a redirected URI prefix that points to a suffix of itself);
- 当客户端对服务器进行攻击,试图寻找潜在的漏洞的时候。
415(unsupported media type)
表示服务器由于不支持其有效载荷的格式,从而拒绝接受客户端的请求。
格式问题的出现有可能源于客户端在 Content-Type
或 Content-Encoding
首部中指定的格式,也可能源于直接对负载数据进行检测的结果。
416(range not satisfiable)
服务器无法处理所请求的数据区间。最常见的情况是所请求的数据区间不在文件范围之内,也就是说,Range
首部的值,虽然从语法上来说是没问题的,但是从语义上来说却没有意义。
一则 416 应答消息包含有一个 Content-Range
首部,提示无法满足的数据区间(用星号 * 表示),后面紧跟着一个“/”
,再后面是当前资源的长度。例如:
遇到这一错误状态码的时候,浏览器一般有两种策略:一种是终止操作,例如,一项中断的下载操作被认为是不可恢复的;另外一种是再次请求整个文件。
417(expectation failed)
表示客户端错误,意味着服务器无法满足 Expect
请求消息头中的期望条件。
426(upgrade required)
表示服务器拒绝处理客户端使用当前协议发送的请求,但是可以接受其使用升级后的协议发送的请求。
服务器会在响应中使用 Upgrade
首部来指定要求的协议。 示例:
HTTP/1.1 426 Upgrade Required
Upgrade: HTTP/3.0
Connection: Upgrade
Content-Length: 53
Content-Type: text/plain
This service requires use of the HTTP/3.0 protocol
428(precondition required)
表示服务器端要求发送条件请求。
一般的,这种情况意味着必要的条件首部——如 If-Match
——的缺失。.
当一个条件首部的值不能匹配服务器端的状态的时候,应答的状态码应该是 412 Precondition Failed
,前置条件验证失败。
429(too many requests)
表示在一定的时间内用户发送了太多的请求,即超出了“频次限制”。
在响应中,可以提供一个 Retry-After
首部来提示用户需要等待多长时间之后再发送新的请求。 示例:
HTTP/1.1 429 Too Many Requests
Content-Type: text/html
Retry-After: 3600
431(request header fields too large)
表示由于请求中的首部字段的值过大,服务器拒绝接受客户端的请求。客户端可以在缩减首部字段的体积后再次发送请求。
该响应码可以用于首部总体体积过大的情况,也可以用于单个首部体积过大的情况。
这种错误不应该出现于经过良好测试的投入使用的系统当中,而是更多出现于测试新系统的时候
451(unavailable for legal reasons)
表示服务器由于法律原因,无法提供客户端请求的资源,例如可能会导致法律诉讼的页面。
500~
500
说明所请求的服务器遇到意外的情况并阻止其执行请求。
这个错误代码是一个通用的“全方位”相应代码, 服务器管理员会记录相关的错误信息并防止以后出现同样的错误。
501(not implemented)
表示请求的方法不被服务器支持,因此无法被处理。服务器必须支持的方法(即不会返回这个状态码的方法)只有 GET 和 HEAD。
请注意,你无法修复 501 错误,需要被访问的 web 服务器去修复该问题。
502(bad gateway)
表示扮演网关或代理角色的服务器,从上游服务器中接收到的响应是无效的。
Gateway
(网关)在计算机网络体系中可以指代不同的设备,502 错误通常不是客户端能够修复的,而是需要由途径的Web服务器或者代理服务器对其进行修复。
503(service unavailable)
表示服务器尚未处于可以接受请求的状态。
通常造成这种情况的原因是由于服务器停机维护或者已超载。注意在发送该响应的时候,应该同时发送一个对用户友好的页面来解释问题发生的原因。该种响应应该用于临时状况下,与之同时,在可行的情况下,应该在 Retry-After
首部字段中包含服务恢复的预期时间。
缓存相关的首部在与该响应一同发送时应该小心使用,因为 503 状态码通常应用于临时状况下,而此类响应一般不应该进行缓存。
504(gateway timeout)
表示扮演网关或者代理的服务器无法在规定的时间内获得想要的响应。
Gateway
(网关)在计算机网络体系中可以指代不同的设备,504 错误通常不是在客户端可以修复的,而是需要由途径的Web服务器或者代理服务器对其进行修复。
505(http version not supported)
表示服务器不支持请求所使用的 HTTP 版本。
511(network authentication required)
表示客户端需要通过验证才能使用该网络。
该状态码不是由源头服务器生成的,而是由控制网络访问的拦截代理服务器生成的。
网络运营商们有时候会在准许使用网络之前要求用户进行身份验证、接受某些条款,或者进行其他形式的与用户之间的互动(例如在网络咖啡厅或者机场)。他们通常用用户设备的 MAC 地址来进行识别。
总结
http状态码是web开发中的重要一环,我们需要通过http协议的状态码来判断浏览器和服务器之间的连接状态,同时根据状态码来解决各种开发中的问题。
常用状态码
200 //请求成功
301 //重定向
304 //可以使用缓存内容
400 //请求语法错误
403 //服务端拒绝访问
404 //找不到请求资源
405 //请求方法错误
500 //服务器内部错误