HTTP 协议
计算机网络
URL 与资源
URL 语法:<scheme>://<user>:<password>@<host>:<port>;<params>?<query>#<frag>
在 URL 中对于保留字符和受限字符需要进行编码
字符 |
保留/受限 |
% |
保留作为编码字符的转义标志 |
/ |
保留作为路径组件中分隔路径段的定界符 |
. |
保留在路径组件中使用 |
.. |
保留在路径组件中使用 |
# |
保留作为分段定界符使用 |
? |
保留作为查询字符串定界符使用 |
; |
保留作为参数定界符使用 |
: |
保留作为方案、用户/口令,以及主机/端口组件的定界符使用 |
$,+ |
保留 |
@&= |
在某些方案的上下文中有特殊的含义,保留 |
{} |
\^~[]' |
<>" |
不安全;这些字符在 URL 范围之外通常是有意义的 |
0x00 - 0x1F, 0x7F |
受限,这些字符都在 US-ASCII 字符集的不可打印区间内 |
> 0x7F |
受限,在此范围内的字符都不在 US-ASCII 字符集的 7 比特范围内 |
HTTP 报文
HTTP 请求报文
<method> <request-URL> <version>
<headers>
<entity-body>
常用 HTTP 方法,并不是所有的服务器都需要实现这些方法,除了这些方法外还可以实现一些自己的请求方法
方法 |
描述 |
GET |
从服务器获取一份文档 |
HEAD |
只从服务器获取文档的首部 |
POST |
向服务器发送需要处理的数据 |
PUT |
将请求的主体部分存储在服务器上 |
TRACE |
对可能经过代理服务器传送到服务器上去的报文进行追踪 |
OPTIONS |
决定可以在服务器上执行哪些方法 |
DELETE |
从服务器上删除一份文档 |
HTTP 扩展方法
方法 |
描述 |
LOCK |
锁定资源,防止别人同时对其进行修改 |
MKCOL |
创建资源 |
COPY |
在服务器上复制资源 |
MOVE |
在服务器上移动资源 |
响应报文
<version> <status> <reason-phrase>
<headers>
<entity-body>
原因短语为状态码提供了文本形式的解释。
信息性状态码
状态码 |
原因短语 |
含义 |
100 |
Continue |
说明收到了请求的初始部分,请客户端继续 |
101 |
Switching Protocols |
说明服务器正在根据客户端的指定,将协议切换成 Update 首部所列的协议 |
成功状态码
状态码 |
原因短语 |
含义 |
200 |
OK |
请求没问题,实体的主体部分包含了所请求的资源 |
201 |
Created |
用于创建服务器对象的请求。主体部分中应该包含各种引用了已创建的资源的 URL,Location首部包含最具体的引用 |
202 |
Accepted |
请求已被接受,但服务器还未执行任何动作。主体部分应该包含对请求状态的描述,还可以包含对请求完成时间的估计或者指向可以获取此信息的位置的指针 |
203 |
Non-Authoritative Information |
实体首部包含的信息不是来自于源端服务器,而是来自资源的一份副本 |
204 |
No Content |
没有实体的主体部分,主要用于在浏览器不转为显示新文档的情况下对其进行更新 |
205 |
Reset Content |
告知浏览器清除当前页面中的所有 HTML 表单元素 |
206 |
Partial Content |
成功执行了一个部分或 Range 请求 |
重定向状态码
状态码 |
原因短语 |
含义 |
300 |
Multiple Choices |
表示资源有多个版本可以使用,客户端需要沟通解决 |
301 |
Moved Permanently |
在请求的 URL 已被移除时使用。响应的 Location 首部中应该包含资源现在所处的 URL |
301 |
Found |
与 301 类似,客户端应该使用 Location 首部给出的 URL 来临时定位资源,但是将来的请求仍应使用老的 URL,仅用于 HTTP/1.0 |
303 |
See Other |
告知客户端应该用另一个 URL 来获取资源。新的 URL 位于响应报文的 Location 首部。 |
304 |
Not Modified |
资源未被修改 |
305 |
Use Proxy |
说明必须通过一个代理来访问资源。代理的位置由 Location 首部给出 |
307 |
Temporary Redirect |
与 301 类似,客户端应该使用 Location 首部给出的 URL 来临时定位资源,但是将来的请求仍应使用老的 URL,仅用于 HTTP/1.1 |
客户端错误状态码
状态码 |
原因短语 |
含义 |
400 |
Bad Request |
用于告知客户端它发送了一个错误的请求 |
401 |
Unauthorized |
请求客户端在获取对资源的访问权之前要对自己进行认证 |
403 |
Forbidden |
说明请求被服务器拒绝了,可以在主体部分包含拒绝的理由 |
404 |
Not Found |
用于说明服务器无法找到所请求的 URL |
405 |
Method Not Allowed |
请求的 URL 不支持该方法,响应中应该包含 Allow 首部 |
406 |
Not Acceptable |
由于参数错误而没有匹配的资源 |
407 |
Proxy Authentication Required |
与 401 类似,但用于要求对资源进行认证的代理服务器 |
408 |
Request Timeout |
客户端完成请求所花的时间太长 |
409 |
Conflict |
说明请求可能在资源上引发一些冲突,响应中应该包含描述冲突的主体 |
410 |
Gone |
资源已被移除 |
411 |
Length Required |
要求在请求报文中包含 Content-Length |
412 |
Precondition Failed |
条件请求其中的一个条件失败 |
413 |
Request Entity Too Large |
客户端发送的主体部分太大 |
414 |
Request URI Too Long |
请求的 URI 太长 |
415 |
Unsupported Media Type |
服务器无法理解或支持客户端所发实体的内容类型 |
416 |
Requested Range Not Satisfiable |
请求的范围无效或无法满足 |
417 |
Expectation Failed |
请求的期望无法满足 |
服务器错误状态码
状态码 |
原因短语 |
含义 |
500 |
Internal Server Error |
服务器遇到一个妨碍它为请求提供服务的错误 |
501 |
Not Implemented |
客户端发起的请求超出服务器的能力范围 |
503 |
Bad Gateway |
代理或网关服务器收到了一条伪响应 |
504 |
Gateway Timeout |
网关或者代理服务器等待响应超时 |
505 |
HTTP Version Not Supported |
无法支持或者不愿意支持该协议版本 |
首部
首部行可以分为多行以提高可读性,多出来的每行前面至少要有一个空格或制表符。
通用首部
首部 |
描述 |
Connection |
允许客户端和服务器指定与请求/响应连接有关的选项 |
Date |
提供日期和时间标志,说明报文是什么时间创建的 |
MIME-Version |
给出了发送端使用的 MIME 版本 |
Trailer |
如果报文采用了分块传输编码方式,就可以用这个首部列出位于报文拖挂部分的首部集合 |
Transfer-Encoding |
告知接收端为了保证报文的可靠传输,对报文采用了什么编码方式 |
Update |
给出了发送端想要“升级”使用的新版本或协议 |
Via |
显示了报文经过的中间节点(代理、网关) |
其中 Connection 首部的值可以是三种不同类型的标签:
- 首部字段名,列出了只与此连接有关的首部,代理在转发 HTTP 报文之前需要删除列出的所有首部
- 任意标签值,用于描述此连接的非标准选项
- 值 close,说明操作完成之后需关闭这条持久连接
通用缓存首部
首部 |
描述 |
Cache-Control |
用于随报文传送缓存指示 |
Pragma |
另一种随报文传送指示的方式,但并不专用于缓存 |
请求首部
首部 |
描述 |
Client-IP |
提供了运行客户端的机器的 IP 地址 |
From |
提供了客户端用户的 Email 地址 |
Host |
给出了接受请求的服务器的主机名和端口号 |
Referer |
提供了包含当前请求 URI 的文档的 URL |
UA-Color |
提供了与客户端显示器的显示颜色有关的信息 |
UA-CPU |
给出了客户端 CPU 的类型或制造商 |
UA-Disp |
提供了与客户端显示器能力有关的信息 |
UA-OS |
给出了运行在客户端机器上的操作系统名称及版本 |
UA-Pixels |
提供了客户端显示器的像素信息 |
User-Agent |
将发起请求的应用程序名称告知服务器 |
Accept 首部
首部 |
描述 |
Accept |
告诉服务器能够发送哪些媒体类型 |
Accept-Charset |
告诉服务器能够发送哪些字符集 |
Accept-Encoding |
告诉服务器能够发送哪些编码方式 |
Accept-Language |
告诉服务器能够发送哪些语言 |
TE |
告诉服务器可以使用哪些扩展传输编码 |
条件请求首部
首部 |
描述 |
Expect |
允许客户端列出某请求所要求的服务器行为 |
If-Match |
如果实体标记与文档当前的实体标记相匹配,就获取这份文档 |
If-Modified-Since |
除非在某个指定的日期之后资源被修改过,否则就限制这个请求 |
If-None-Match |
如果提供的实体标记与当前文档的实体标记不相符,就获取文档 |
If-Range |
允许对文档的某个范围进行条件请求 |
If-Unmodified-Since |
除非在某个指定日期之后资源没有修改过,否则就限制这个请求 |
Range |
如果服务器支持范围请求,就请求资源的指定范围 |
安全请求首部
首部 |
描述 |
Authorization |
包含了客户端提供的服务器,以便对其自身进行认证的数据 |
Cookie |
向服务器传送一个令牌 |
Cookie2 |
说明请求端指出的 cookie 版本 |
代理请求首部
首部 |
描述 |
Max-Forward |
将请求转发给其他代理或网关的最大次数 |
Proxy-Authorization |
与 Authorization 首部相同,在代理进行认证时使用的 |
Proxy-Connection |
与 Connection 首部相同,在与代理建立连接时使用的 |
响应首部
首部 |
描述 |
Age |
响应持续时间(从最初创建开始) |
Public |
服务器为其资源支持的请求方法列表 |
Retry-After |
如果资源不可用的话,在此日期或时间重试 |
Server |
服务器应用程序软件的名称和版本 |
Title |
对 HTML 文档来说,就是 HTML 文档的源端给出的标题 |
Warning |
比原因短语中更详细一些的警告报文 |
协商首部
首部 |
描述 |
AcceptRanges |
对此资源来说,服务器可接受的范围类型 |
Vary |
服务器查看的其他首部列表,服务器会根据这些首部的内容挑选出最适合的资源版本发送给客户端 |
安全响应首部
首部 |
描述 |
Proxy-Authenticate |
来自代理的对客户端的质询列表 |
Set-Cookie |
设置 cookie |
Set-Cookie2 |
设置 cookie |
WWW-Authenticate |
来自服务器的对客户端的质询列表 |
实体首部
首部 |
描述 |
Allow |
列出了可以对此实体执行的请求或方法 |
Location |
告知客户端实体实际上位于何处 |
内容首部
首部 |
描述 |
Content-Base |
解析主题中的相对 URL 时使用的基础 URL |
Content-Encoding |
对主体执行的任意编码方式 |
Content-Language |
理解主体时最适宜使用的自然语言 |
Content-Length |
主体的长度或尺寸 |
Content-Location |
资源实际所处的位置 |
Content-MD5 |
主题的 MD5 校验和 |
Content-Range |
在整个资源中此实体表示的字节范围 |
Content-Type |
这个主体的对象类型 |
实体缓存首部
首部 |
描述 |
ETag |
与此实体相关的实体标记 |
Expires |
实体不再有效,要从原始的源端再次获取此实体的日期和时间 |
Last-Modified |
这个实体最后一次被修改的日期和时间 |