HTTP协议将传输的信息分隔为两部分:HTTP信息头、HTTP信息体。通过HTTP头信息,使客户端请求服务器资源或服务器响应客户端请求时,可以传递额外的信息。HTTP头信息格式为名称:值,名称不区分大小写,如:Content-Type: text/html。通过HTTP消息头,可以使服务器或客户端了解对方所使用的协议版本、内容类型、编码方式等。
# HTTP消息头分类
在HTTP消息头中,有些是客户端特有的,有些是服务端所特有的,也有些是消息头是通用的。按HTTP消息头出现的上下文环境,有以下分类:
1.通用头
HTTP消息头中,有些既适用于客户端的请求头,也适用于服务端的响应头,与HTTP消息体内最终传输的数据是无关的,只适用于要发送的消息。这些消息头由于HTTP协议版本的不同可能会有所区别,在HTTP/1.1中,这些消息头有:Cache-Control:、Connection:、Date:、 Pragma:、Trailer:、Transfer-Encoding:、Upgrade:、 Via:、Warning:。
2. 请求头
HTTP 请求头为所请求的资源或请求本身,提供了更为精确的描述信息。其中有些缓存相关头描述了缓存信息,这些头会改变GET请求时获取资源的方式,如:If-Modified-Since。有些消息头描述了用户偏好,如: Accept-Language和Accept-Charset表示客户端所使用语言及编码方式、User-Agent表示客户端的代理方式。
新增加的请求头不能在旧的HTTP版本中使用,但是,如果服务器和客户端都能对相关头进行处理,就可以在请求中使用。在这种情况下,客户端不应该假定服务器有对相关头的处理能力。未知的请求头被处理为实体头。
3. 响应头
HTTP 响应头为响应消息提供了更多信息。如,关于资源位置的描述Location:,关于务器本身的描述使用Server:
新增加的响应头不能在旧的HTTP版本中使用,但是,如果服务器和客户端都能对相关头进行处理,就可以在响应中使用。在这种情况下,服务器不应该假定客户端有对相关头的处理能力。未知的响应头被处理为实体头。
4. 实体头
HTTP 实体头提供了关于消息体的描述。如,消息体的长度Content-Length:,消息体的MIME类型Content-Type:。新的实体头可以旧HTTP版本中使用。
HTTP消息头也可以按缓存与百缓存的处理方式分分类:
1. 端到端(End-To-End)头
End-To-End头信息必须发送到消息的最终接收人,即:接收请求消息的服务器或接收响应消息的客户端。这些头信息意味着中间代理必须重发未修改的内容,也必须存储缓存。
End-To-End头在一个路由器连接的两种物理网络中使用,即:OSI的应用层和运输层。
2. 逐跳(Hop-By-Hop)头
Hop-By-Hop头被单一的传输层连接使用,Hop-By-Hop头标识传输内容不得通过代理或缓存转发。这些头信息有:Connection:、Keep-Alive:、Proxy-Authenticate:、Proxy-Authorization:、 TE:、Trailers:、Transfer-Encoding:、Upgrade:。注意,只有Hop-By-Hop头可能会设置使用Connection: 通用头。
# 一些有用的请求头
众多的HTTP请求头中,有几个是特别有用且应当正确设置的。如果你要创建HTTP请求,如,创建XMLHttpRequest或一个延时写入并通过XPCOM发送自定义的HTTP请求时,这时确保正确写入请求头就非常重要,进行这些操作时,用户使用浏览器一般自动写入请求头。
1. 控制所访问资源的语言
大多数用户所使用的浏览器客户端,如:Firefox,都允许用户设置所偏好的语言,设置后浏览器会在发送请求时添加一个Accept-Language: 头信息。而服务器,在收到HTTP请求时,也可以根据这个头信息返回对应语言的资源。
2. 有条件GET请求
缓存是提高网站访问速度的重要方式,当使用XMLHttpRequest进行部分页面数据的刷新时,使用If-Modified-Since:头信息会告诉服务器,访问更新过的内容,可以有效的提高访问效率。
# 一些有用的响应头
正确的配置网站服务器,是保证网站性能和安全的关键。在众多的HTTP响应头中,有几个响应头是比较重要性且应当配置在服务器中。
1. 框架(frame)控制
几个跨站脚本(XSS)攻击,就是利用第三方框架(frame或iframe)。现代浏览器已经支持CSPframe-ancestors指令,在服务器端将其设置为"none",可以有效访止浏览器在框架内显示该资源,使用它的关键资源(如:表单数据或关键信息)可以有效减少XSS攻击风险。注意,这个响应头并不是缓解XSS风险的唯一途径,也可通过一些内容安全策略实现。
2. 数据压缩
最大限度地减少传输的数据量,可以有效加速了网页的显示。虽然可以通Gulp等工具,将静态文件数据压缩。但如果要压缩传输数据,那么必须在Web服务器级别进行相关配置。设置后,客户端会发送一个Accept-Encoding:头,告诉服务器所接受的编码方式;而服务器也会响应一个Content-Encoding:头,告诉客户端所使用的压缩方式。
注:Nginx服务器可以通过配置Gzip实现数据压缩。
3. 缓存控制
HTTP缓存是提高网站访问速度另一种有效方式,它可防止同一未修改资源被多次访问。正确的配置服务器的响应头,可以使用户代理(浏览中器)充分缓存数据。
配置缓存时,需要设置以下项:
任何静态资源都应该提供了一个Expires:响应头。这样,资源可以用户代理达到它自身限制前(如:达到缓存大小限制),充分的缓存数据。
任何动态资源都应该提供了一个Cache-control:响应头。理论上讲,所有安全的HTTP方法(GET、HEAD)甚至幂等方法(DELETE、PUT),都可以配置缓存,但在实际使用中会有一些问题。
4. 设置MIME类型
MIME类型响应头Content-type会告诉客户端传输文档的类型,扩展名在文档的网络传中已经失去意义。正确配置服务器此项设置,对文件传输非常重要,用户代理客户端经常通过MIME类型判断文档的打开方式或获取资源后的默认动作。
# 常用的HTTP请求头与响应头
# 关于HTTP消息头
HTTP消息头是在,客户端请求(Request)或服务器响应(Response)时传递的,位请求或响应的第一行,HTTP消息体(请求或响应的内容)是其后传输。HTTP消息头,以明文的字符串格式传送,是以冒号分隔的键/值对,如:Accept-Charset: utf-8,每一个消息头最后以回车符(CR)和换行符(LF)结尾。HTTP消息头结束后,会用一个空白的字段来标识,这样就会出现两个连续的CR-LF。
HTTP消息头由IANA(The Internet Assigned Numbers Authority,互联网数字分配机构)来整理和维护。其标准最早来源于RFC 4229。IANA将其整理到了消息头文档,文档中还包括了一些新提出的信息头。
HTTP消息头支持自定义, 自定义的专用消息头一般会添加'X-'前缀。
# 常用的HTTP请求头
协议头 | 说明 | 示例 |
---|---|---|
Accept | 可接受的响应内容类型(Content-Types) | Accept: text/plain |
Accept-Charset | 可接受的字符集 | Accept-Charset: utf-8 |