虽然是公认的译法是:超文本传输协议
《图解HTTP》 |
HTTP
版本
HTTP /1.0 1996.05提出
HTTP /1.1 1997.01提出
名称
超文本转移协议
虽然是公认的译法是:超文本传输协议
方法
GET
获取资源
POST
主要目的并不是获取响应的主体内容
传输实体主体
HEAD
和GET 方法一样,但是不返回报文主体,只返回报文的首部
获得报文的首部
OPTIONS
例子:
Request:
OPTIONS * HTTP/1.1
Host:www.hackr.jp
Response:
HTTP/1.1 200 OK
Allow:GET,POST,HEAD,OPTIONS
客户端询问服务器支持的方法
CONNECT
CONNECT方法要求与带代理服务器通信时建立隧道,主要采用SSL协议或者TLS协议把通信内容加密后通过网络隧道传输
要求用隧道协议连接代理
报文
可以分请求报文和响应报文
报文首部和报文主体之间通常通过空行(CR+LF)划分
CR:Carriage Return(回车符)
LF:Line Feed(换行符)
由方法、URI 、HTTP版本、HTTP首部字段等构成
报文主体
可以不要报文主体
报文首部
首部字段类型
通用首部字段 General Header Fields
请求报文和响应报文都会使用的首部
请求首部字段 Request Header Fields
响应首部字段 Response Header Fields
实体首部字段 Entity Header Fields
针对请求报文和响应报文的实体部分使用的首部
首部字段结构
首部字段:字段值
一个首部字段可以有多个值
比如:
Content-Type:text/html
Keep-Alive:timeout=15,max=10
首部字段类型
HTTP/1.1 通用首部字段
Cache-Control
控制缓存的行为,参数可选
public
Cache-Control:public
明确表明其他用户也可以使用缓存
private
Cache-Control:private
响应只以特定的用户为对象,缓存服务器只针对该用户提供缓存服务,针对其他用户,缓存服务器不会返回缓存的资源
no-cache
Cache-Control:no-cache
如果客户端发送的请求中包含no-cache指令,则表示客户端不会接收缓存过的响应(防止缓存服务器返回过期的资源);
如果服务器返回的响应中包含no-cache指令,那么缓存服务器不能对资源进行缓存
no-store
Cache-Control:no-store
使用该指令时,暗示请求(或者对应的响应中)包含机密信息,不能在本地对请求或者响应中的任何一部分进行缓存
max-age
Cache-Control:max-age=604800(单位:秒)
客户端:如果缓存没有过期,(缓存服务器)就返回缓存给我
服务器端:604800s内不再对资源进行有效性确认(不必再向服务器进行有效性确认)
HTTP/1.1如果同时遇到max-age 字段和Expires字段,则直接忽略Expires字段
max-stale
Cache-Control:max-stale=3600(单位:秒)
客户端发送请求,缓存服务器接收后,如果缓存过期了,只要max-stale没有过期,依然作为响应返回给客户端。如果max-stale没有指定数值,那么无论过多久,都返回给客户端
only-if-cached
Cache-Control:only-if-cached
表示仅当缓存服务器在本地有缓存资源的情况下才会返回给客户端,同时不会跟源服务器确认有效性。
如果缓存服务器本地没有缓存,那么返回给客户端504 Gateway Timeout
no-transform
Cache-Control:no-transform
表示无论在请求还是响应中,缓存服务器都不能更改媒体类型
这样做可以防止缓存或者代理服务器压缩图片等类似操作
Connection
功能有二个
1.控制不在转发给代理的首部字段
2.管理持久连接
客户端:
GET / HTTP/1.1
Upgrade:HTTP/1.1
Connection:Upgrade
代理这边:
GET / HTTP/1.1
即:
Connection:不再转发的首部字段名
默认,HTTP/1.1都是持久连接
Connection:Keep-Alive
Date
表示创建HTTP报文的时间和日期
Date:Tue,03 Jul 2012 04:40:56 GMT
Trailer
表示,在报文的末端有很重要的字段,通常在分块编码时使用,例如;
Trailer:Expires
...(报文主体)...
Expires:Tue,28 Sep 2004 23:59:59 GMT
上例中,报文主体末端出现了Expires字段
Transfer-encoding
规定了传输报文主体时采用的编码方式,该传输编码方式仅对分块传输编码方式有效
Upgrade
用于检测HTTP协议或者其他协议是否可以使用更高的版本进行通信。
Upgrade作用对象为客户端和服源服务器之间(不包含缓存、代理),因此使用首部字段Upgrade时,必须使用:
Connection:Upgrade
Via
使用该首部是为了追踪客户端和服务器之间的请求和响应报文的传输路径
HTTP/1.1 请求首部字段
Accept
Accept:text/html,application/xhtml+xml,application/xml,q=0.5
Accept 字段用于通知服务器用户代理能够处理的媒体类型及媒体类型的相对优先级,一般使用type/subtype的形式,一次可以指定多种媒体类型
文本文件:
text/html,text/plain,text/css,
application/xhtml+html,application/xml......
图片文件:
image/jpeg,image/gif,image/png....
视频文件:
video/mpeg,video/quicktime....
Accept-Charset
Accept-Charset:iso-8859-5,unicode-1-1;q=0.8
用来通知服务器用户代理能够支持的字符集及字符集的相对优先级,可以同时指出多种字符集。
其中,q表示品质系数,范围是0~1,越大表示优先级越高,和Accept字段中的q一样
Accept-Encoding
Accept-Encoding:gzip,deflate
用来通知服务器用户代理能够支持的内容编码及内容编码的相对优先级,可以同时指出多种内容编码
另外,也可以使用星号(*)作为通配符,表示支持任意的编码格式
Accept-Language
Accept-Encoding:gzip,deflate
用来通知服务器用户代理能够支持的内容编码及内容编码的相对优先级,可以同时指出多种内容编码
另外,也可以使用星号(*)作为通配符,表示支持任意的编码格式
Authorization
Authorization:Basic dsKA dsdSsejSkdlsjflsZA==
用来通知服务器用户代理的认证信息
From
From:info@hackr.jp
用来通知服务器使用用户代理的用户的电子邮件的地址
可能会因为代理的不同,将电子邮件地址记录在User-Agent首部字段内
Host
Host:www.hackr.jp
该字段在HTTP/1.1规范内是唯一一个必须包含在请求内的首部字段
该字段会告知服务器,请求的资源所处的互联网主机名和端口号
If-Match
If-Match:“123456”
属于附带条件之一,会告知服务器匹配资源所用的实体标记(Etag),仅当匹配成功时才处理请求,否则,返回412 Precondition Failed
也可以使用星号(*)进行指定该字段的值,这种情况下,服务器会忽略Etag的值,只要有资源就处理请求
If-None-Match
If-Match:*
属于附带条件之一,和If-Match字段的作用相反。
If-Modified-Since
If-Modified-Since:Tue,03 Jul 2012 04:40:56 GMT
属于附带条件之一,它会告知服务器该字段值早于资源的更新时间,则希望处理请求,否则,说明没有更新过,返回304 Not Modified
If-Unmodified-Since
If-Modified-Since:Tue,03 Jul 2015 04:35:56 GMT
属于附带条件之一,和If-Modified-Since字段的作用相反
If-Range
属于附带条件之一,会告知服务器若指定的字段值(Etag或者时间)和请求资源的ETag或者时间相一致,那么作为范围请求处理,否则,返回全部资源
Range
Range:Bytes=5001-10000
范围请求
若服务器处理成功,则返回206 Partial Content 。否则,返回200 OK及全部资源(而非部分资源)
TE
TE:gzip,deflate;q=0.3
该字段会告知服务器客户端能够处理响应的传输编码方式及对应的优先级
Accept-Encoding字段是针对内容编码
User-Agent
User-Agent:Mozilla/5.0 (Windows NT 6.1;)
该字段会将创建请求的浏览器和用户代理名称等信息传达给服务器
HTTP/1.1 响应首部字段
Accept-Ranges
Accept-Ranges:bytes
该字段用来告知客户端服务器能否处理范围请求,如果能处理,则返回bytes,否则,返回None,即
Accept-Ranges:None
Age
Age:600(单位:秒)
该字段用来告知客户端源服务器在多久前创建了响应
ETag
ETag:"a238sfhnloet9183579ohssoud8s"
该字段能告知客户端实体标识。它是一种将可用资源进行唯一性标识的方式。服务器会为每一份资源分配唯一的ETag,当资源更新时,ETag值也会更新
强ETag:无论实体发生多么细微的变化都会改变其值
ETag:"usgi-1234"
弱ETag:只用于提示资源是否相同。只有资源发生了根本性改变才会改变其值。这时,会在该字段值前面加“W/”,如:
ETag:W/"usgi-1234"
Retry-After
Retry-After:120(单位:秒)
该字段告知客户端应该在多久之后再次发送请求。
主要配合503 Service Unavailable 和3XX Redirection 响应一起使用
Server
该字段会告知客户端当前服务器安装的HTTP程序的信息,比如:
Server:Apache/2.2.17 (Unix)
Server:Apache/2.2.6(Unix) PHP/5.2.5
WWW-Authenticate
WWW-Authenticate:Basic realm="Usagidesign Auth"
该字段用于HTTP访问认证。
它会告知客户端是适用于访问请求URI所指定资源的认证方案(Basic或是Digest)和带参数提示的质询(Challenge)。
Vary
Vary:Accept-Language
该字段可以对缓存进行控制。
例子:
当代理服务器接收到(源服务器发送的)带有Vary指定获取资源的请求时,如果使用的Accept-Language 字段的值相同(和客户端发送过来的Accept-Language字段比较),那么直接从代理服务器返回响应,否则,则需要从源服务器获取资源后再返回响应
HTTP/1.1 实体首部字段
Allow
Allow:GET,HEAD
该字段告知客户端支持指定资源的所有可用的HTTP方法
Content-Encoding
Content-Encoding:gzip
该字段会告知客户端服务器对实体的主体部分采用的编码格式
主要有四种编码格式:
1.gzip
2.compress
3.deflate
4.identity
Content-Language
Content-Language:zh-CN
该字段告知客户端,实体主体采用的自然语言
Content-Length
Content-Lenth:15000(单位:bytes)
该字段告知客户端实体主体部分的大小
Content-Range
Content-Range:bytes 5001-10000/10000
针对范围请求,告知客户端作为响应返回的实体的范围
Content-Type
Content-Type:text/html;charset=UTF-8
该字段说明了实体对象的媒体类型,采用type/subtype的形式赋值
其他首部字段
Cookie相关的首部字段
Set-Cookie
Set-Cookie:status=enable;Expires=Tue, 05 Jul 2011 07:23:56
服务器端告知客户端各种信息,属于响应首部字段
Cookie
Cookie:status=enable
该字段会告知服务器当客户端想要获得HTTP状态管理时,就会在请求中包含从服务器接收到的Cookie
其他首部字段
X-Frame-Options
X-Frame-Options:DENY
该字段属于响应首部,用于控制网站内容在其他网站的Frame标签内的显示问题
X-XSS-Protection
X-XSS-Protection:1
属于响应首部,针对跨站脚本攻击(XSS)的一种策略,用于控制浏览器XSS防护机制的开关。
0 : 将XSS过滤状态disable
1 :将XSS过滤状态enable
DNT
DNT:1
属于请求首部
DNT=Do Not Track:拒绝个人信息被收集
0:同意被追踪
1:拒绝被追踪
P3P
状态码
1XX
Informational (信息型状态码) ,表示接收的请求正在处理
2XX
Sucess (成功状态码) 请求正常处理完毕
200 OK
表示客户端发送给服务器的请求在服务器端被正确的处理
204 No Content
表示服务器接收到的请求已经被正确的处理,但是返回的报文中不包含实体的主体部分,也不允许返回任何实体的主体
206 Partial Content
表示客户端进行了范围请求,而服务器成功执行了这部分的GET请求。
响应报文中的Content-Range制定范围实体的内容
3XX
Redirection (重定向)
301 Moved Permanently
表示永久性重定向
表示请求的资源已经重新分配了URI
302 Found
临时性重定向,表示请求的资源已经重新分配了URI,和301 类似。
303 See Other
表示请求的资源存在着另外一个URI,应该使用GET方法定向获取请求的资源
303和302有着相似的功能,但是303 明确规定表示客户端应使用GET方法获取资源
304 Not Modified
表示客户端发送附带条件的请求时,服务端允许访问资源,但未满足条件的情况。
其中,附带条件的请求是指采用GET方法请求的报文中包含 If-Match,If-Modified-Since,If-None-Match,If-Range,If-Unmodified-Since中的任一首部
4XX
Client Error (客户端错误状态码) 表示服务器无法处理请求
400Bad Request
表示请求报文中存在语法错误
401 Unauthorized
表示请求需要通过HTTP认证。如果之前已经进行过一次认证,则表示认证失败
403 Forbidden
表示请求的资源被服务器拒绝了
404 Not Found
表示服务器上无法找到请求的资源
或者,服务器拒绝请求且不想给出理由时使用
5XX
Server Error (服务器错误状态码) 表示服务器处理请求出错
500 Interal Server Error
服务器端内部发生了错误
503 Service Unavailable
表示服务器暂时处于超负荷状态或者正在进行停机维护,无法处理请求