HTTP首部
不管是请求报文还是响应报文都会包含首部信息。HTTP首部都是由字段名和字段值构成的中间由英文冒号:隔开。一个首部字段名可以对应多个字段值。
四种首部字段的类型
- 通用首部字段请求报文和响应报文都会是使用的首部。
- 请求首部字段从客户端向服务器发送请求报文时使用的首部。补充了请求的附加内容客户端信息响应内容相关优先级等信息。
- 响应首部字段从服务器端向客户端返回响应报文时使用的首部。补充了响应的附加内容也会要求客户端添加额外的内容信息。
- 实体首部字段针对请求报文和响应报文的实体部分使用的首部。补充了资源内容的更新时间等于实体有关的信息。
通用首部字段
Cache-Control
缓存控制相关。示例
Cache-Control: private,max-age0,no-cache
表示针对特定用户每次都需要重新访问服务器资源。max-age不为0则在过期之前不会重复访问。
Connection
控制不再转发给代理管理持久连接。
示例
GET /chat HTTP/1.1Host: server.example.comUpgrade: websocketConnection: Upgrade
该请求用于websocket协议。
再例如
Connection: close
HTTP/1.1默认是长连接如果想明确需要断开连接指定首部字段Connection为close即可。对应的有Keep-Alive。
Upgrade
用于检测HTTP协议及其他协议是否可以使用更高的版本进行通信其参数值可以用来指定一个完全不同的通信协议。
示例
GET /chat HTTP/1.1Host: server.example.comUpgrade: TLS/1.0, HTTP/1.1Connection: Upgrade
使用Upgrade字段时还必须额外指定Connection: Upgrade。
对于服务端来说收到带有Upgrade字段的请求可以用101 Switching Protocols状态码作为响应返回。
Date
表名创建报文的时间。示例
Date:Tue, 14 Mar 2017 14:18:34 GMT
Pragma
HTTP/1.1之前版本的遗留字段只用于客户端的请求中。示例
Pragma: no-cache
Trailer
记录了报文主体后还会有哪些首部字段。
Transfer-Encoding
规定传输报文主体时采用的编码方式。HTTP/1.1的传输编码方式仅对分块传输编码有效。示例
Transfer-Encoding: chunked
Via
用于追踪客户端与服务端的请求和响应报文的传输路径。示例
Via: cache11.l2nu17[0,200-0,H], cache7.l2nu17[0,0], kunlun6.cn36[0,304-0,H], kunlun4.cn36[0,0]
Warning
通常用于告知用户一些与缓存相关的警告信息。
请求首部字段
Accept
该字段可通知服务器用户代理能够处理的媒体类型及媒体类型的相对优先级。
若想要给显示的媒体类型增加优先级则使用q来额外表示权重值并用分号;进行分割。当权重值的范围是01(可精确到小数点后3位)且1为最大值。另外不指定权重q值时默认权重位1.0。
示例
Accept: text/html,application/xhtmlxml,application/xml;q0.9,image/webp,*/*;q0.8
每个逗号分隔代表一个类型text/html、application/xhtmlxml和image/webp权重1.0application/xml权重0.9其它的权重0.8。
Accept-Charset
该字段可用来通知服务器用户代理支持的字符串及字符集的相对优先顺序。另外可一次性指定多种字符集。与首部字段Accept相同的是可用权重q值来表示相对优先级。
示例
Accept-Charset: iso-8859-5, unicode-1-1;q0.8
Accept-Encoding
该字段用来告知服务器用户代理支持的内容编码及内容编码的优先级顺序可一次性制定多种内容编码。示例
Accept-Encoding: gzip, deflate, sdch
Accept-Language
该字段用来告知服务器用户代理能够处理的自然语言集。示例
Accept-Language: zh-CN,zh;q0.8,en;q0.6
Authorization
该字段用来告知服务器用户代理的认证信息即证书值。想要通过服务器认证的代理会在接收到返回的401状态码响应后把首部字段Authorization加入请求中。示例
Authorization: Basic YWRtaW46YWRtaW4
示例这里的加密串是用户名和密码的base64加密字符串。
一次典型的访问场景是
使用HTTP Authorization的场景不会用COOKIE也就是说每次都会送帐号密码信息过去。然后我们都知道base64编码基本上等于明文。这削弱了安全。由于种种缺点HTTP Authorization现在用的并不多。不过在路由器等场合还是有应用的原因是HTTP Authorization最简单使用起来几乎是零成本。 在你需要做访问控制又不想拖上SSO、数据库之类的东西的时候HTTP Authorization不失为一个简洁的选项。
Expect
该字段是客户端用来告知服务器期望出现的某种特定行为。如服务器无法理解客户端的期望则会发生错误返回状态码417。
From
该字段用来告知服务器使用用户代理的用户的电子邮件地址。目的就是为了显示搜索引擎等用户代理的负责人的电子邮件联系方式。使用代理时应尽可能包含From首部字段。
Host
多个虚拟主机可运行在同一个IP上因此需要使用Host首部字段加以区分。该字段用来告知服务器请求的资源所处的互联网主机名和端口号。
示例
GET / HTTP/1.1Host: server.example.com
If-Match
形如If-xxx的样式的请求首部字段都可以称之为条件请求。服务器接受到附带条件的请求时只有判断指定条件为真才会执行请求。
If-Match首部字段属于附带条件之一它会告诉服务器匹配资源所用的实体标记(ETag)值。而这时的服务器无法使用弱ETag值。
If-Modified-Since
该字段用来告知服务器若If-Modified-Since字段值早于资源的更新时间则希望能处理该请求。而在制定的字段值的日期时间之后如果请求的资源都没有过更新则返回状态码304。
示例
If-Modified-Since: Fri, 15 Feb 2013 03:06:57 GMT
If-None-Match
该字段和If-Match字段作用相反。用于指定的字段值的实体标记ETag值与请求资源的ETag不同时就告知服务器处理该请求。
If-Range
该字段告知服务器若制定的字段值(ETag值或者时间)和请求资源的ETag值或时间相一致则作为范围请求处理。反之返回全体资源。下面对比If-Range和If-Match的不同
使用If-Range字段时如果不一致时则忽略范围请求返回全部资源。而实用If-Match字段时如果不一致则需要再次进行请求处理。
If-Unmodified-Since
该字段和If-Modified-Since字段相反它的作用是告知服务器指定的请求资源只有在字段值哪指定的日期时间之后未发生更新的情况下才能处理请求。如果在指定日期时间后发生了更新则返回状态码412。
Max-Forwards
通过TRACE方法或OPTIONS方法时发送包含首部字段Max-Forwards的请求时该字段以十进制整数形式指定可经过的服务器最大数目。
Proxy-Authorization
接收到从代理服务器发来的认证质询时客户端会发送包含首部字段Proxy-Authorization的请求以告知服务器认证所需要的信息。认证行为发生在客户端与代理之间。客户端和服务器之间的认证实用首部字段Authorization可起到相同作用。
Range
对于只需要获取部分资源的范围请求包含首部字段Range即可告知服务器资源的制定范围。
Referer
该字段告知服务器请求的原始资源的URI。客户端一般都会发送Referer首部字段給服务器。
但当直接在浏览器的地址栏输入URI或出于安全的考虑时也可以不发送该首部字段。因为原始资源的URI中的查询字符串可能含有ID和密码等保密信息要是写进Referer转发給其他服务器则有可能导致保密信息的泄露。
示例
Referer: http://www.cnblogs.com/xuxiang/p/3407539.html
TE
该字段告知服务器客户端能够处理响应的传输编码方式和相对优先级。它和首部字段Accept-Encoding的功能相似但是这是用于传输编码。
User-Agent
该字段会将创建请求的浏览器种类和用户代理名称等信息传达给服务器。由网络爬虫发起请求时有可能会在字段内添加爬虫作者的电子邮件地址。此外如果请求经过代理那么中间也可能被添加上代理服务器的名称。
示例
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36
响应首部字段
Accept-Ranges
告知客户端服务器能否处理范围请求以指定获取服务器的某部分资源可指定的字段值分2种
- bytes:可处理范围请求
- none:不能处理范围请求
示例
Accept-Ranges: bytes
Age
告知客户端源服务器创建响应多久了单位s。若创建响应的是缓存服务器该字段指缓存后响应再次发起认证到认证完成的时间值此时必须加上首部字段Age。
示例
Age:12017054
ETag
告知客户端实体标识。
这是一种将资源以字符串形式做唯一标识的一种方式服务器会为没份资源分配对应的ETag值。
另外当资源更新时ETag值也需要更新
ETag: "82e22293907ce725faf67773957acd12"
强ETag值和弱ETag值
- 强ETag值不论实体发生多么细微的变化都会改变其值
ETag: "usagi-1234"
- 弱ETag值
只提示资源是否相同只有资源发生了根本改变产生差异才会改变ETag值此时会在字段值最开始处附加W/
ETag: W/"usagi-1234"
Location
将响应接受方引导至某个与请求URI位置不同的资源。基本上该字段都会配合3xxRedirction的响应提供重定向的URI。示例
Location: http://www.usagidesign.jp/sample.html
Proxy-Authenticate
把代理服务器所要求的认证信息发给客户端他的认证行为在客户端与代理间进行。示例
Proxy-Authenticate: basic realm"Usagidesign Auth"
Retry-After
告知客户端在多久之后再次发送请求主要配合状态码503 Service Unavailable响应或者3XX Redirect响应一起使用。
字段值可以指定具体的日期时间Wed, 04 Jul 2012 06: 34: 24 GMT等格式也可以是创建响应后的秒数。
示例
Retry-After: 120
Server
告知客户端当前服务器上安装的http服务器应用程序的信息。其中包含软件应用名称甚至版本号和安装时的启动项。示例
Server: Tengine
Vary
控制缓存。源服务器向代理传达关于本地缓存使用方法的命令。客户端收到从代理服务器收到的从源服务器返回的包含该字段指定项的响应之后若再次进行缓存仅对请求中含有相同字段的请求返回缓存。
示例
Vary: Accept-Encoding
WWW-Authenticate
HTTP访问认证。告知客户端适用于访问请求URI所指定资源的认证方案和带参数提示的查询。
状态码401 Unauthorized响应中肯定包含该字段。
实体首部字段
Allow
通知客户端能够支持的Request-URI指定资源的所有http方法。如果服务器接收到不支持的方法会返回状态码405Method Not Allowed作为响应返回。示例
AllowGET, HEAD
Content-Encoding
告知客户端服务器对实体的主体部分的选用的内容编码方式。内容编码指在不丢失实体信息的前提下所进行的压缩。主要采用以下这四种内容编码方式
- gizp
- conpress
- deflate
- identity
示例
Content-Encoding: gizp
Content-Lanuage
告知客户端实体主体使用的自然语言优先接收的语言。示例
Content-Lanuage: zh-CN
Content-Length
表明实体主体部分的大下单位是字节。若对实体主体进行编码传输不能使用该字段。示例
Content-Length: 15000
Content-Location
给出了与报文主体部分相对应的URI。与Location不同该字段表示的是报文主体返回资源的URI。
示例
Content-Location: http://www.baidu/com/index-miss.html
Content-MD5
由一串由MD5算法生成的值其目的在于检查报文主体在传输中是否保持完整以及确认传输到达。 示例
Content-MD5: OFJKGKLDFUIGNG35565FGNHLDGNH
Content-Range
告知客户端作为响应返回的实体的哪个部分符合范围请求单位字节表示当前发送部分及整个实体大小。示例
Content-Range: bytes 5001-10000/10000
Expires
告知客户端资源失效的日期。如果首部字段存在Cache-Control有指定max-age指定时会优先处理max-age指令。示例
Expires: Wed, 04 Jul 2016 09:26:05 GMT
Last-Modified
指明资源的最终修改的时间。示例
Last-Modified: Wed, 04 Jul 2016 09:26:05 GMT
COOKIE相关首部字段
COOKIE的工作机制是用户识别及状态管理。
实现原理方便管理用户状态通过web浏览器将一些数据临时写入用户的计算机内当用户访问时可通过通信方式取回之前发送的COOKIE。
Set-COOKIE
expires 指定浏览器可发送COOKIE的有效期。若不指定则默认为会话时间段内。一旦COOKIE从服务端发送到客户端服务器就不存在可显式删除COOKIE的方法但可通过覆盖已过期的COOKIE实现对客户端的实质性删除。
path 用于限制指定COOKIE发送范围的文件目录。
domain 通过该属性指定的域名可做到与结尾匹配一致。
- secure 限制web界面仅在HTTPS安全连接时才可以发送COOKIE。发送COOKIE时指定属性的方法如下
Set-COOKIE: namevalue; secure
- HttpCOOKIE COOKIE的扩展功能使Javascript脚本无法获得COOKIE。主要目的是为了防止跨站脚本攻击对COOKIE的信息窃取。发送指定HttpOnly属性的方法如下
Set-COOKIE: namevalue; HttpOnly
COOKIE
告知服务器客户端想获得http状态管理支持时就会在请求中包含从服务器接收到的COOKIE。接收多个时同样可以以多个发送。示例
COOKIE: pgv_pvi7481519104; Hm_lvt_cc17b07fc9529e3d80b4482c9ce090861461665113
其它首部字段
由于HTTP首部字段可以自行扩展所以还有一些其他的非标准的首部字段。例如X-Frame-Options、X-XSS-Protection、DNT、P3P等等这里就不一一介绍了。
参考 1、HTTP 教程 | 菜鸟教程http://www.runoob.com/http/http-tutorial.html 2、php中header函数参数的Cache-control:private,no-cache,must-revalidate,max-age是使用方法! - 斯世轻尘 - 博客园http://www.cnblogs.com/xuxiang/p/3407539.html 3、HTTP Authorization - \(firecat的代码足迹\) - 博客频道 - CSDN.NEThttp://blog.csdn.net/libaineu2004/article/details/38384487 4、http协议八请求首部字段 - IMyalost - 博客园http://www.cnblogs.com/imyalost/p/5726556.html 5、http协议九响应首部字段 - IMyalost - 博客园http://www.cnblogs.com/imyalost/p/5737024.html
转:https://www.cnblogs.com/52fhy/p/6551408.html
【文章转自 武汉网站设计公司 http://www.1234xp.com/wuhan.html 欢迎留下您的宝贵建议】