目录

什么是 HTTP?

概述

HTTP超文本传输协议Hyper Text Transfer Protocol)是一种能够获取如 HTML 这样的网络资源的 protocol通讯协议

它是在 Web 上进行数据交换的基础,是一种 client-server 协议。

也就是说,请求通常是由像浏览器这样的接受方发起的。

一个完整的 Web 文档通常是由不同的子文档拼接而成的,

像是文本、布局描述、图片、视频、脚本等等。

客户端和服务端通过交换各自的消息(与数据流正好相反)进行交互。

由像浏览器这样的客户端发出的消息叫做 requests,被服务端响应的消息叫做 responses

//gcore.jsdelivr.net/gh/G2/i@data/static_files/images/2021/Fetching_a_page.png
Fetching

HTTP 被设计于 20 世纪 90 年代初期,是一种可扩展的协议。

它是应用层的协议,通过 TCP 或者是 TLS 加密的 TCP 连接来发送,

理论上任何可靠的传输协议都可以使用。

因为其良好的扩展性,时至今日,它不仅被用来传输超文本文档,

还用来传输图片、视频或者向服务器发送如 HTML 表单这样的信息。

HTTP 还可以根据网页需求,仅获取部分 Web 文档内容更新网页。

基于 HTTP 的组件系统

HTTP 是一个 client-server 协议:

请求通过一个实体被发出,实体也就是用户代理。

大多数情况下,这个用户代理都是指浏览器,

当然它也可能是任何东西,比如一个爬取网页生成维护搜索引擎索引的机器爬虫。

每一个发送到服务器的请求,都会被服务器处理并返回一个消息,也就是 response 。

在这个请求与响应之间,还有许许多多的被称为 proxies 的实体,

他们的作用与表现各不相同,比如有些是网关,还有些是 caches 等。

实际上,在一个浏览器和处理请求的服务器之间,

还有路由器、调制解调器等许多计算机。

由于 Web 的层次设计,那些在网络层和传输层的细节都被隐藏起来了。

HTTP 位于最上层的应用层。

虽然底层对于分析网络问题非常重要,但是大多都跟对 HTTP 的描述不相干。

客户端:user-agent

user-agent 就是任何能够为用户发起行为的工具。这个角色通常都是由浏览器来扮演。一些例外情况,比如是工程师使用的程序,以及 Web 开发人员调试应用程序。

浏览器总是作为发起一个请求的实体,他永远不是服务器(虽然近几年已经出现一些机制能够模拟由服务器发起的请求消息了)。

要展现一个网页,浏览器首先发送一个请求来获取页面的 HTML 文档,再解析文档中的资源信息发送其他请求,获取可执行脚本或 CSS 样式来进行页面布局渲染,以及一些其它页面资源(如图片和视频等)。然后,浏览器将这些资源整合到一起,展现出一个完整的文档,也就是网页。浏览器执行的脚本可以在之后的阶段获取更多资源,并相应地更新网页。

一个网页就是一个超文本文档。也就是说,有一部分显示的文本可能是链接,启动它(通常是鼠标的点击)就可以获取一个新的网页,使得用户可以控制客户端进行网上冲浪。浏览器来负责发送 HTTP 请求,并进一步解析 HTTP 返回的消息,以向用户提供明确的响应。

Web 服务端

在上述通信过程的另一端,是由 Web Server 来服务并提供客户端所请求的文档。Server 只是虚拟意义上代表一个机器:它可以是共享负载(负载均衡)的一组服务器组成的计算机集群,也可以是一种复杂的软件,通过向其他计算机(如缓存,数据库服务器,电子商务服务器 …)发起请求来获取部分或全部资源。

Server 不一定是一台机器,但一个机器上可以装载的众多 Servers。在 HTTP/1.1 和 Host 头部中,它们甚至可以共享同一个 IP 地址。

代理(Proxies)

在浏览器和服务器之间,有许多计算机和其他设备转发了 HTTP 消息。由于 Web 堆栈的分层结构,它们大多都出现在传输层、网络层和物理层上,对于 HTTP 应用层而言就是透明的,虽然它们可能会对应用层性能有重要影响。还有一部分是表现在应用层上的,被称为代理(Proxies)。这些请求可以是透明的,可以转发接收到的请求而不以任何方式更改请求,也可以是不透明的,在这种情况下,它们将以某种方式更改请求,然后再将其传递给服务器。代理主要有如下几种作用:

  • 缓存(可以是公开的也可以是私有的,像浏览器的缓存)
  • 过滤(像反病毒扫描,家长控制…)
  • 负载均衡(让多个服务器服务不同的请求)
  • 认证(对不同资源进行权限管理)
  • 日志记录(允许存储历史信息)

HTTP 的基本性质

  • 简单

    虽然下一代 HTTP/2 协议将 HTTP 消息封装到了帧(frames)中,HTTP 大体上还是被设计得简单易读。HTTP 报文能够被人读懂,还允许简单测试,降低了门槛,对新人很友好。

  • 可扩展

    在 HTTP/1.0 中出现的 HTTP headers 让协议扩展变得非常容易。只要服务端和客户端就新 headers 达成语义一致,新功能就可以被轻松加入进来。

  • 无状态的,但不是无会话的

    HTTP 是无状态的:在同一个连接中,两个执行成功的请求之间是没有关系的。这就带来了一个问题,用户没有办法在同一个网站中进行连续的交互,比如在一个电商网站里,用户把某个商品加入到购物车,切换一个页面后再次添加了商品,这两次添加商品的请求之间没有关联,浏览器无法知道用户最终选择了哪些商品。而使用 HTTP 的头部扩展,HTTP Cookies 就可以解决这个问题。把 Cookies 添加到头部中,创建一个会话让每次请求都能共享相同的上下文信息,达成相同的状态。

    注意
    HTTP 本质是无状态的,使用 Cookies 可以创建有状态的会话。

HTTP 和连接

一个连接是由传输层来控制的,这从根本上不属于 HTTP 的范围。HTTP 并不需要其底层的传输层协议是面向连接的,只需要它是可靠的,或不丢失消息的(至少返回错误)。在互联网中,有两个最常用的传输层协议:TCP 是可靠的,而 UDP 不是。因此,HTTP 依赖于面向连接的 TCP 进行消息传递,但连接并不是必须的。

在客户端(通常指浏览器)与服务器能够交互(客户端发起请求,服务器返回响应)之前,必须在这两者间建立一个 TCP 链接,打开一个 TCP 连接需要多次往返交换消息(因此耗时)。HTTP/1.0 默认为每一对 HTTP 请求/响应都打开一个单独的 TCP 连接。当需要连续发起多个请求时,这种模式比多个请求共享同一个 TCP 链接更低效。

为了减轻这些缺陷,HTTP/1.1 引入了流水线(被证明难以实现)和持久连接的概念:底层的TCP连接可以通过 Connection 头部来被部分控制。HTTP/2 则发展得更远,通过在一个连接复用消息的方式来让这个连接始终保持为暖连接。

为了更好的适合 HTTP,设计一种更好传输协议的进程一直在进行。Google 就研发了一种以UDP 为基础,能提供更可靠更高效的传输协议 QUIC

HTTP 能控制什么

多年以来,HTTP 良好的扩展性使得越来越多的 Web 功能归其控制。

缓存和认证很早就可以由 HTTP 来控制了。

另一方面,对同源同域的限制到 2010 年才有所改变。

以下是可以被 HTTP 控制的常见特性。

  • 缓存
    文档如何缓存能通过 HTTP 来控制。服务端能告诉代理和客户端哪些文档需要被缓存,缓存多久,而客户端也能够命令中间的缓存代理来忽略存储的文档。
  • 开放同源限制
    为了防止网络窥听和其它隐私泄漏,浏览器强制对 Web 网站做了分割限制。只有来自于相同来源的网页才能够获取网站的全部信息。这样的限制有时反而成了负担,HTTP 可以通过修改头部来开放这样的限制,因此 Web 文档可以是由不同域下的信息拼接成的(某些情况下,这样做还有安全因素考虑)。
  • 认证
    一些页面能够被保护起来,仅让特定的用户进行访问。基本的认证功能可以直接通过 HTTP 提供,使用 Authenticate 相似的头部即可,或用 HTTP Cookies 来设置指定的会话。
  • 代理和隧道
    通常情况下,服务器和/或客户端是处于内网的,对外网隐藏真实 IP 地址。因此 HTTP 请求就要通过代理越过这个网络屏障。但并非所有的代理都是 HTTP 代理。例如,SOCKS 协议的代理就运作在更底层,一些像 FTP 这样的协议也能够被它们处理。
  • 会话 使用 HTTP Cookies 允许你用一个服务端的状态发起请求,这就创建了会话。虽然基本的 HTTP 是无状态协议。这很有用,不仅是因为这能应用到像购物车这样的电商业务上,更是因为这使得任何网站都能轻松为用户定制展示内容了。

HTTP 数据流

当客户端想要和服务端进行信息交互时(服务端是指最终服务器,或者是一个中间代理),过程表现为下面几步:

  1. 打开一个 TCP 连接:TCP 连接被用来发送一条或多条请求,以及接受响应消息。客户端可能打开一条新的连接,或重用一个已经存在的连接,或者也可能开几个新的 TCP 连接连向服务端。

  2. 发送一个 HTTP 报文:HTTP 报文(在 HTTP/2 之前)是语义可读的。在 HTTP/2 中,这些简单的消息被封装在了帧中,这使得报文不能被直接读取,但是原理仍是相同的。

    1
    2
    3
    
    GET / HTTP/1.1
    Host: developer.mozilla.org
    Accept-Language: fr
    
  3. 读取服务端返回的报文信息:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    
    HTTP/1.1 200 OK
    Date: Sat, 09 Oct 2010 14:28:02 GMT
    Server: Apache
    Last-Modified: Tue, 01 Dec 2009 20:18:22 GMT
    ETag: "51142bc1-7449-479b075b2891b"
    Accept-Ranges: bytes
    Content-Length: 29769
    Content-Type: text/html
       
    <!DOCTYPE html... (here comes the 29769 bytes of the requested web page)
    
  4. 关闭连接或者为后续请求重用连接。

当 HTTP 流水线启动时,后续请求都可以不用等待第一个请求的成功响应就被发送。然而HTTP流水线已被证明很难在现有的网络中实现,因为现有网络中有很多老旧的软件与现代版本的软件共存。因此,HTTP 流水线已被在有多请求下表现得更稳健的 HTTP/2 的帧所取代。

HTTP 报文

HTTP/1.1 以及更早的 HTTP 协议报文都是语义可读的。在 HTTP/2 中,这些报文被嵌入到了一个新的二进制结构,帧。帧允许实现很多优化,比如报文头部的压缩和复用。即使只有原始HTTP 报文的一部分以 HTTP/2 发送出来,每条报文的语义依旧不变,客户端会重组原始HTTP/1.1 请求。因此用 HTTP/1.1 格式来理解 HTTP/2 报文仍旧有效。

有两种 HTTP 报文的类型,请求与响应,每种都有其特定的格式。

请求

//gcore.jsdelivr.net/gh/G2/i@data/static_files/images/2021/HTTP_Request.png
Request

请求由以下元素组成:

  • 一个 HTTP 的 method,经常是由一个动词像 GET, POST 或者一个名词像 OPTIONSHEAD 来定义客户端的动作行为。通常客户端的操作都是获取资源(GET 方法)或者发送HTML form 表单值(POST 方法),虽然在一些情况下也会有其他操作。
  • 要获取的资源的 path具体路径,通常是上下文中就很明显的元素资源的 URL,它没有 protocol(http://),domain(developer.mozilla.org),或是 TCP 的 port端口(HTTP 一般在 80 端口)。
  • HTTP 协议版本号。
  • 为服务端表达其他信息的可选头部 headers。
  • 对于一些像 POST 这样的方法,报文的 body 就包含了发送的资源,这与响应报文的 body 类似。

响应

//gcore.jsdelivr.net/gh/G2/i@data/static_files/images/2021/HTTP_Response.png
Response

响应报文包含了下面的元素:

  • HTTP 协议版本号。
  • 一个状态码(status code),来告知对应请求执行成功或失败,以及失败的原因。
  • 一个状态信息,这个信息是非权威的状态码描述信息,可以由服务端自行设定。
  • HTTP headers,与请求头部类似。
  • 可选项,比起请求报文,响应报文中更常见地包含获取的资源 body。

总结

HTTP 是一种简单可扩展的协议,其 Client-Server 的结构以及轻松扩展头部信息的能力使得 HTTP 可以和 Web 共同发展。

即使 HTTP/2 为了提高性能将 HTTP 报文嵌入到帧中这一举措增加了复杂度,但是从 Web 应用的角度看,报文的基本结构没有变化,从 HTTP/1.0 发布起就是这样的结构。会话流依旧简单,通过一个简单的 HTTP message monitor网络监视器 就可以查看和纠错。

归纳

HTTP 请求方法

HTTP 定义了一组请求方法, 以表明要对给定资源执行的操作。

指示针对给定资源要执行的期望动作。

请求方法(Methods)说明
GET该方法请求表示指定资源。 使用的请求应仅检索数据。
POST该方法用于将实体提交给指定的资源(例如提交表单或者上传文件),通常会导致状态更改或对服务器产生副作用。(指函数或表达式修改基本变量的行为)。
HEAD请求一个与 GET 请求的响应相同的响应,但没有响应体。
PUT从客户端向服务器传送的数据取代指定的文档的内容。(适用于添加操作)
DELETE删除指定的资源。
CONNECT建立一个到由目标资源标识的服务器的隧道。
OPTIONS用于获取当前 URL 所支持的方法。若请求成功,则它会在 HTTP 头中包含一个名为「Allow」的头,值是所支持的方法,如「GET,POST」
TRACE沿着到目标资源的路径执行一个消息环回测试,提供了一种实用的 debug 机制。可以用于诊断 HTTP 请求报文在发送的途中经过多层代理后,是否被修改过了。
PATCH用于对资源应用部分修改,对 PUT 方法的补充。

HTTP 标头

HTTP 标头使客户端和服务器可以通过 HTTP 请求或响应传递其他信息。

HTTP 标头由不区分大小写的名称,后跟冒号(:)和值组成。 值之前的空格将被忽略。

类型说明
认证WWW-Authenticate定义应用于访问资源的认证方法。
Authorization包含使用服务器对用户代理进行身份验证的凭据。
Proxy-Authenticate定义应用于访问代理服务器背后的资源的认证方法。
Proxy-Authorization包含使用代理服务器对用户代理进行身份验证的凭据。
缓存Age在几秒钟内,对象已处于代理缓存中的时间。
Cache-Control请求和响应中缓存机制的指令。
Clear-Site-Data清除与请求网站相关的浏览数据(例如 Cookie、存储、缓存)。
Expires响应被视为过时的日期/时间。
Pragma实现特定的标题,可能会在请求响应链的任何地方产生各种影响。用于与头尚未存在的 HTTP/1.0 缓存的向后兼容性。Cache-Control
Warning有关可能问题的一般警告信息。
条件Last-Modified资源的最后修改日期,用于比较同一资源的多个版本。 它的准确性不如 ETag,但在某些环境中更容易计算。 使用If-Modified-SinceIf-Unmodified-Since的条件请求使用此值来更改请求的行为。
ETag标识资源版本的唯一字符串。 使用If-MatchIf-None-Match的条件请求使用此值来更改请求的行为。
If-Match使请求具有条件,并且仅在存储资源与给定的 ETag 匹配时应用该方法。
If-None-Match使请求有条件,并且仅在存储的资源与给定的 ETag 匹配时应用该方法。这用于更新缓存(用于安全请求),或用于防止在已经存在时上传新资源。
If-Modified-Since使请求有条件,并期望实体仅在给定日期之后进行修改时才能传输。这仅用于在缓存过时时传输数据。
If-Unmodified-Since使请求具有条件,并期望实体仅在给定日期之后未进行修改时才能传输。这确保了特定范围的新片段与前一个片段的一致性,或在修改现有文档时实施乐观的并发控制系统。
Vary确定如何匹配请求标题,以决定是否可以使用缓存响应,而不是从源服务器请求新的响应。
连接管理Connection控制当前交易完成后网络连接是否保持打开状态。
Keep-Alive控制持久连接应保持打开状态的时间。
内容协商Accept通知服务器可以发送回的数据类型。
Accept-Charset客户理解的字符编码。
Accept-Encoding编码算法,通常是一种压缩算法,可用于发回的资源。
Accept-Language通知服务器服务器预计会发回的人类语言。这是一个提示,不一定在用户的完全控制之下:服务器应始终注意不要覆盖明确的用户选择(如从下拉中选择语言)。
饼干Cookie包含先前由服务器使用Set-Cookie标头发送的存储的 HTTP cookie。
Set-Cookie将 Cookie 从服务器发送到用户代理。
CORSAccess-Control-Allow-Origin指示响应是否可以共享。
Access-Control-Allow-Credentials指示当凭据标志为 true 时是否可以公开对请求的响应。
Access-Control-Allow-Headers用于响应预检请求,以指示发出实际请求时可以使用哪些 HTTP 标头。
Access-Control-Allow-Methods指定响应预检请求而访问资源时允许的方法。
Access-Control-Expose-Headers通过列出标题的名称来指示哪些标题可以作为响应的一部分公开。
Access-Control-Max-Age指示可以将预检请求的结果缓存多长时间。
Access-Control-Request-Headers在发出预检请求时使用,以使服务器知道在发出实际请求时将使用哪些 HTTP 标头。
Access-Control-Request-Method在发出预检请求时使用,以使服务器知道在发出实际请求时将使用哪种 HTTP 方法。
Origin指示提取的来源。
Timing-Allow-Origin指定允许查看通过资源定时 API 功能检索的属性值的原点,否则,由于跨域限制,该原点将报告为零。
下载Content-Disposition指示传输的资源是应该内联显示(不带标题的默认行为),还是应该像下载一样进行处理,浏览器应显示「另存为」对话框。
消息主体信息Content-Length资源的大小,以十进制字节数表示。
Content-Type指示资源的介质类型。如:text/html; charset=utf-8application/x-www-form-urlencoded
Content-Encoding用于指定压缩算法。
Content-Language描述面向受众的人类语言,以便用户能够根据用户自己的首选语言进行区分。
Content-Location指示返回数据的替代位置。
重 定向Location指示网址将页面重定向到。
请求上下文From包含一个互联网电子邮件地址,用于控制请求用户代理的用户。
Host指定服务器的域名(用于虚拟托管)和(可选)服务器正在收听的 TCP 端口号码。
Referer跟踪当前请求页面的链接的上一个网页的地址。
Referrer-Policy引用者标题中发送的引用信息的管理应包含在请求中。
User-Agent包含一个特征字符串,允许网络协议同行识别请求软件用户代理的应用程序类型、操作系统、软件供应商或软件版本。
响应上下文Allow列出资源支持的一组 HTTP 请求方法。
Server包含有关源服务器用于处理请求的软件的信息。
控制Expect表示服务器需要满足的期望才能正确处理请求。
Max-Forwards此标题仅与 TRACE 方法一起使用,以限制请求所经过的代理或其他中介机构的数量。
其他Date包含消息的来源日期和时间。
Upgrade升级标题字段的相关 RFC 文档为 RFC 7230,第 6.7 节。该标准为当前客户端、服务器、传输协议连接的升级或更改为其他协议制定了规则。

HTTP 响应状态码

HTTP 响应状态代码指示特定 HTTP 请求是否已成功完成。

响应分为五类:

  • 信息响应(100199

  • 成功响应(200299

  • 重定向(300399

  • 客户端错误(400499

  • 服务器错误(500599

状态代码由 section 10 of RFC 2616定义

code说明
100 Continue这个临时响应表明,迄今为止的所有内容都是可行的,客户端应该继续请求,如果已经完成,则忽略它。
101 Switching Protocol该代码是响应客户端的 Upgrade 标头发送的,并且指示服务器也正在切换的协议。
102 Processing(WebDAV)此代码表示服务器已收到并正在处理该请求,但没有响应可用。
103 Early Hints此状态代码主要用于与 Link 链接头一起使用,以允许用户代理在服务器仍在准备响应时开始预加载资源。
200 OK请求成功。成功的含义取决于 HTTP 方法:
GET:资源已被提取并在消息正文中传输。
HEAD:实体标头位于消息正文中。
POST:描述动作结果的资源在消息体中传输。
TRACE:消息正文包含服务器收到的请求消息。
201 Created该请求已成功,并因此创建了一个新的资源。这通常是在 POST 请求,或是某些 PUT 请求之后返回的响应。
202 Accepted请求已经接收到,但还未响应,没有结果。意味着不会有一个异步的响应去表明当前请求的结果,预期另外的进程和服务去处理请求,或者批处理。
203 Non-Authoritative Information服务器已成功处理了请求,但返回的实体头部元信息不是在原始服务器上有效的确定集合,而是来自本地或者第三方的拷贝。当前的信息可能是原始版本的子集或者超集。例如,包含资源的元数据可能导致原始服务器知道元信息的超集。使用此状态码不是必须的,而且只有在响应不使用此状态码便会返回 200 OK 的情况下才是合适的。
204 No Content服务器成功处理了请求,但不需要返回任何实体内容,并且希望返回更新了的元信息。响应可能通过实体头部的形式,返回新的或更新后的元信息。如果存在这些头部信息,则应当与所请求的变量相呼应。如果客户端是浏览器的话,那么用户浏览器应保留发送了该请求的页面,而不产生任何文档视图上的变化,即使按照规范新的或更新后的元信息应当被应用到用户浏览器活动视图中的文档。由于 204 响应被禁止包含任何消息体,因此它始终以消息头后的第一个空行结尾。
205 Reset Content服务器成功处理了请求,且没有返回任何内容。但是与 204 响应不同,返回此状态码的响应要求请求者重置文档视图。该响应主要是被用于接受用户输入后,立即重置表单,以便用户能够轻松地开始另一次输入。与 204 响应一样,该响应也被禁止包含任何消息体,且以消息头后的第一个空行结束。
206 Partial Content服务器已经成功处理了部分 GET 请求。类似于 FlashGet 或者迅雷这类的 HTTP 下载工具都是使用此类响应实现断点续传或者将一个大文档分解为多个下载段同时下载。该请求必须包含 Range 头信息来指示客户端希望得到的内容范围,并且可能包含 If-Range 来作为请求条件。
207 Multi-Status(WebDAV)由 WebDAV(RFC 2518) 扩展的状态码,代表之后的消息体将是一个 XML 消息,并且可能依照之前子请求数量的不同,包含一系列独立的响应代码。
208 Already Reported(WebDAV)在 DAV 里面使用: propstat 响应元素以避免重复枚举多个绑定的内部成员到同一个集合。
226 IM Used226 IM Used服务器已经完成了对资源的 GET 请求,并且响应是对当前实例应用的一个或多个实例操作结果的表示。
300 Multiple Choice被请求的资源有一系列可供选择的回馈信息,每个都有自己特定的地址和浏览器驱动的商议信息。用户或浏览器能够自行选择一个首选的地址进行重定向。
301 Moved Permanently被请求的资源已永久移动到新位置,并且将来任何对此资源的引用都应该使用本响应返回的若干个 URI 之一。如果可能,拥有链接编辑功能的客户端应当自动把请求的地址修改为从服务器反馈回来的地址。除非额外指定,否则这个响应也是可缓存的。
302 Found请求的资源现在临时从不同的 URI 响应请求。由于这样的重定向是临时的,客户端应当继续向原有地址发送以后的请求。只有在 Cache-Control 或 Expires 中进行了指定的情况下,这个响应才是可缓存的。
303 See Other对应当前请求的响应可以在另一个 URI 上被找到,而且客户端应当采用 GET 的方式访问那个资源。这个方法的存在主要是为了允许由脚本激活的 POST 请求输出重定向到一个新的资源。
304 Not Modified如果客户端发送了一个带条件的 GET 请求且该请求已被允许,而文档的内容(自上次访问以来或者根据请求的条件)并没有改变,则服务器应当返回这个状态码。304 响应禁止包含消息体,因此始终以消息头后的第一个空行结尾。
307 Temporary Redirect请求的资源现在临时从不同的 URI 响应请求。由于这样的重定向是临时的,客户端应当继续向原有地址发送以后的请求。只有在 Cache-Control 或 Expires 中进行了指定的情况下,这个响应才是可缓存的。
308 Permanent Redirect这意味着资源现在永久位于由 Location: HTTP Response 标头指定的另一个 URI。 这与 301 Moved Permanently HTTP 响应代码具有相同的语义,但用户代理不能更改所使用的 HTTP 方法:如果在第一个请求中使用 POST,则必须在第二个请求中使用 POST
400 Bad Request1、语义有误,当前请求无法被服务器理解。除非进行修改,否则客户端不应该重复提交这个请求。
2、请求参数有误。
401 Unauthorized当前请求需要用户验证。该响应必须包含一个适用于被请求资源的 WWW-Authenticate 信息头用以询问用户信息。客户端可以重复提交一个包含恰当的 Authorization 头信息的请求。如果当前请求已经包含了 Authorization 证书,那么 401 响应代表着服务器验证已经拒绝了那些证书。如果401响应包含了与前一个响应相同的身份验证询问,且浏览器已经至少尝试了一次验证,那么浏览器应当向用户展示响应中包含的实体信息,因为这个实体信息中可能包含了相关诊断信息。
402 Payment Required此响应码保留以便将来使用,创造此响应码的最初目的是用于数字支付系统,然而现在并未使用。
403 Forbidden服务器已经理解请求,但是拒绝执行它。与 401 响应不同的是,身份验证并不能提供任何帮助,而且这个请求也不应该被重复提交。如果这不是一个 HEAD 请求,而且服务器希望能够讲清楚为何请求不能被执行,那么就应该在实体内描述拒绝的原因。当然服务器也可以返回一个 404 响应,假如它不希望让客户端获得任何信息。
404 Not Found请求失败,请求所希望得到的资源未被在服务器上发现。没有信息能够告诉用户这个状况到底是暂时的还是永久的。假如服务器知道情况的话,应当使用 410 状态码来告知旧资源因为某些内部的配置机制问题,已经永久的不可用,而且没有任何可以跳转的地址。404 这个状态码被广泛应用于当服务器不想揭示到底为何请求被拒绝或者没有其他适合的响应可用的情况下。
405 Method Not Allowed请求行中指定的请求方法不能被用于请求相应的资源。该响应必须返回一个 Allow 头信息用以表示出当前资源能够接受的请求方法的列表。 鉴于 PUT,DELETE 方法会对服务器上的资源进行写操作,因而绝大部分的网页服务器都不支持或者在默认配置下不允许上述请求方法,对于此类请求均会返回 405 错误。
406 Not Acceptable请求的资源的内容特性无法满足请求头中的条件,因而无法生成响应实体。
407 Proxy Authentication Required与 401 响应类似,只不过客户端必须在代理服务器上进行身份验证。代理服务器必须返回一个 Proxy-Authenticate 用以进行身份询问。客户端可以返回一个 Proxy-Authorization 信息头用以验证。
408 Request Timeout请求超时。客户端没有在服务器预备等待的时间内完成一个请求的发送。客户端可以随时再次提交这一请求而无需进行任何更改。
409 Conflict由于和被请求的资源的当前状态之间存在冲突,请求无法完成。这个代码只允许用在这样的情况下才能被使用:用户被认为能够解决冲突,并且会重新提交新的请求。该响应应当包含足够的信息以便用户发现冲突的源头。
410 Gone被请求的资源在服务器上已经不再可用,而且没有任何已知的转发地址。这样的状况应当被认为是永久性的。如果可能,拥有链接编辑功能的客户端应当在获得用户许可后删除所有指向这个地址的引用。如果服务器不知道或者无法确定这个状况是否是永久的,那么就应该使用 404 状态码。除非额外说明,否则这个响应是可缓存的。
411 Length Required服务器拒绝在没有定义 Content-Length 头的情况下接受请求。在添加了表明请求消息体长度的有效 Content-Length 头之后,客户端可以再次提交该请求。
412 Precondition Failed服务器在验证在请求的头字段中给出先决条件时,没能满足其中的一个或多个。这个状态码允许客户端在获取资源时在请求的元信息(请求头字段数据)中设置先决条件,以此避免该请求方法被应用到其希望的内容以外的资源上。
413 Payload Too Large服务器拒绝处理当前请求,因为该请求提交的实体数据大小超过了服务器愿意或者能够处理的范围。此种情况下,服务器可以关闭连接以免客户端继续发送此请求。如果这个状况是临时的,服务器应当返回一个 Retry-After 的响应头,以告知客户端可以在多少时间以后重新尝试。
414 URI Too Long请求的 URI 长度超过了服务器能够解释的长度,因此服务器拒绝对该请求提供服务。这比较少见,通常的情况包括:本应使用 POST 方法的表单提交变成了 GET 方法,导致查询字符串(Query String)过长。
415 Unsupported Media Type对于当前请求的方法和所请求的资源,请求中提交的实体并不是服务器中所支持的格式,因此请求被拒绝。
416 Range Not Satisfiable如果请求中包含了 Range 请求头,并且 Range 中指定的任何数据范围都与当前资源的可用范围不重合,同时请求中又没有定义 If-Range 请求头,那么服务器就应当返回 416 状态码。
417 Expectation Failed此响应代码意味着服务器无法满足 Expect 请求标头字段指示的期望值。
418 I'm a teapot服务器拒绝尝试用 超文本咖啡壶控制协议
421 Misdirected Request该请求针对的是无法产生响应的服务器。 这可以由服务器发送,该服务器未配置为针对包含在请求 URI 中的方案和权限的组合产生响应。
422 Unprocessable Entity (WebDAV)请求格式良好,但由于语义错误而无法遵循。
423 Locked (WebDAV)正在访问的资源被锁定。
424 Failed Dependency (WebDAV)由于先前的请求失败,所以此次请求失败。
425 Too Early服务器不愿意冒着风险去处理可能重播的请求。
426 Upgrade Required服务器拒绝使用当前协议执行请求,但可能在客户机升级到其他协议后愿意这样做。 服务器在 426 响应中发送 Upgrade 头以指示所需的协议。
428 Precondition Required原始服务器要求该请求是有条件的。 旨在防止「丢失更新」问题,即客户端获取资源状态,修改该状态并将其返回服务器,同时第三方修改服务器上的状态,从而导致冲突。
429 Too Many Requests用户在给定的时间内发送了太多请求(限制请求速率)。
431 Request Header Fields Too Large服务器不愿意处理请求,因为它的 请求头字段太大( Request Header Fields Too Large)。 请求可以在减小请求头字段的大小后重新提交。
451 Unavailable For Legal Reasons用户请求非法资源,例如:由政府审查的网页。
500 Internal Server Error服务器遇到了不知道如何处理的情况。
501 Not Implemented此请求方法不被服务器支持且无法被处理。只有 GET 和 HEAD 是要求服务器支持的,它们必定不会返回此错误代码。
502 Bad Gateway此错误响应表明服务器作为网关需要得到一个处理这个请求的响应,但是得到一个错误的响应。
503 Service Unavailable服务器没有准备好处理请求。 常见原因是服务器因维护或重载而停机。 请注意,与此响应一起,应发送解释问题的用户友好页面。 这个响应应该用于临时条件和 Retry-After:如果可能的话,HTTP 头应该包含恢复服务之前的估计时间。 网站管理员还必须注意与此响应一起发送的与缓存相关的标头,因为这些临时条件响应通常不应被缓存。
504 Gateway Timeout当服务器作为网关,不能及时得到响应时返回此错误代码。
505 HTTP Version Not Supported服务器不支持请求中所使用的 HTTP 协议版本。
506 Variant Also Negotiates服务器有一个内部配置错误:对请求的透明内容协商导致循环引用。
507 Insufficient Storage服务器有内部配置错误:所选的变体资源被配置为参与透明内容协商本身,因此不是协商过程中的适当端点。
508 Loop Detected (WebDAV)服务器在处理请求时检测到无限循环。
510 Not Extended客户端需要对请求进一步扩展,服务器才能实现它。服务器会回复客户端发出扩展请求所需的所有信息。
511 Network Authentication Required511 状态码指示客户端需要进行身份验证才能获得网络访问权限。

参考地址