图解HTTP-6

6 HTTP首部
当HTTP首部中出现两个或者两个以上具有相同首部字段名时会怎样?这种情况在规范中尚未明确,根据浏览器内部处理逻辑的不同,结果可能并不一致。
通用首部字段
  • Cache-Control: no-cache/no-store ⚠️区别是:no-cache代表不缓存过期的资源,缓存会向源服务器进行有效期确认后处理资源。no-store才是真正地不进行缓存,注意区分!

  • Connection 首部字段具备如下两个作用。1、控制不再转发给代理的首部字段2、管理持久连接。

  1. Connection: 不再转发的首部字段名
  2. Connection: close

HTTP/1.1版本默认的连接都是持久连接,为此,客户端会在持久连接上连续发送请求,当服务器端想明确断开连接时,则指定Connection:close、而在HTTP/1.1之前想要维持持续连接,则需要指定Connection首部字段的值为Keep-Alive。

  • 首部字段Date表示生成报文的日起和时间
  • 通用首部字段Pragma:no-cahce 只用在客户端发送的请求中,客户端要求所有的中间服务器不返回缓存的资源。这个字段时HTTP/1.1之前版本的历史遗留字段,所有中间服务器如果都以HTTP/1.1为基准,则可以直接采用Cache-Control:no-cache指定缓存的处理方式最为理想。但要掌握全部中间服务器使用的HTTP版本是不现实的,所以为了兼容发送的请求会同时含有以下两个首部字段。
  1. Cache-Control: no-cache
  2. Pragma: no-cache
  • Trailer
  • Transfer-Encoding
  • Upgrade
  • Via:追踪客户端与服务器之间的请求和响应报文的传输路径。
  • Warning
请求首部字段
  • Accept:可通知服务器,用户代理能够处理的媒体类型及媒体类型的相对优先级。常见的有:text/html,text/plain,application/xml,image/jpeg,image/gif,video/mpeg,application/zip…..添加优先级时可以使用:q=表示权重用分号分隔,q范围是0~1,可以精确到小数点后3位。q默认大小为1.
  • Accept: text/plain; q=0.5, text/html, text/x-dvi; q=0.8, text/x-c
  • 可接受的类型优先级如下:
  1. text/html text/x-c
  2. text/x-dvi
  3. text/plain
  • Accept-Charset:iso-8859-5,unicode-1-1;q=0.8 通知服务器用户客户端支持的字符集以及字符集的优先级。
  • Accept-Encoding:gzip,deflate 通知服务器用户代理支持的内容编码及优先级顺序。不同的编码对应了不同的算法。比如gzip:Lempel-Ziv算法以及32位循环冗余校验(Cyclic Redundancy Check通称CRC)。
  • Accept-Language: zh-cn,zh;q=0.7,en-us,en;q=0.3 告知服务器用户代理能够处理的自然语言集及优先级,例子中表示客户端在服务器有中文版资源的情况下,会请求返回中文版对应的响应,没有中文版时则返回英文版响应。
  • Authorization: Basic dfdaurerNdfjaduYA== 告知服务器用户代理的认证信息
  • Expect
  • From: info@hackr.jp 通常就是告知服务器用户代理的用户的电子邮件地址。
  • Host: www.hackr.jp 告知服务器请求的资源所处的互联网主机名和端口号。唯一一个必须被包含在请求首部的字段,因为它和以单台服务器分配多个域名的虚拟主机的工作机制有很密切的关联,这就是首部字段Host必须存在的意义。
  • If-Match
  • If-Modified-Since
  • If-None-Match
  • If-Range
  • If-Unmodified-Since
  • Max-Forwards:2 表示只能往下个服务器转发2次,既经历2个代理服务器就返回。没经过一个服务器就减一做重新计算。可以通过这个字段的灵活应用掌握通信失败时由那个服务器造成的失败。
  • Proxy-Authorization
  • Range: bytes=500-1000 只获取部分资源的范围请求。若无法处理该范围的请求时,则返回状态码200 OK的响应及全部资源。
  • Referer:正确的拼写应该是Referrer http://www.hackr.jp/index.html 告知服务器请求的原始资源的URI
  • TE
  • User-Agent 将创建请求的浏览器和用户代理名称等信息传达给服务器
响应首部字段
  • Accept-Ranges 告知客户端是否能够处理范围请求,以指定获取服务器端某个部分的资源。当可处理范围请求时指定为bytes反之none。
  • Age 告知源服务器在多久前创建了响应,字段值的单位为秒
  • ETag
  • Location:将响应接收方引导至某个与请求URI位置不同的资源。基本该字段会配合3xx:Redirection的响应,提供重定向的URI
  • Proxy-Authenticate
  • Retry-After 告知客户端应该在多久之后再次发送请求。
  • Server 告知客户端当前服务器上安装的HTTP服务器应用程序信息。
  • Vary 源服务器告知代理服务器传达关于本地缓存使用方法的命令。比如需要有相同的请求首部字段。
实体首部字段
  • Allow:通知客户端支持Request-URI指定资源的所有HTTP方法,当服务器收到不支持HTTP方法时,会以状态码405 Method Not Allowed作为响应返回。于此同时还会将把所有能支持HTTP方法写入首部字段Allow后返回。
  • Content-Encoding 告知客户端报文使用了某种方式进行了压缩。
  • Content-Language: zh-CN
  • Content-Length 资源大小
  • Content-Location 报文主体返回资源对应的URI
  • Content-MD5 主要是检查报文传输过程中是否保持了完整及确认传输到达
  • Content-Range: bytes 100-3000针对范围请求,返回响应时使用的首部字段
  • Content-Type: text/html;charset=UTF-8
  • Expires:将资源实效的日期告知客户端
  • Last-Modified 指明资源最终修改的时间。一般就是Request-URI指定资源被修改的时间
Cookie服务的首部字段
  • Set-Cookie

字段的属性如下

属性 说明
NAME=VALUE 赋予Cookie的名称和值
expires=DATE Cookie的有效期,若不指定则为浏览器关闭为止
path=PATH 将服务器上的文件目录作为Cookie的适用对象
domain=域名 作为Cookie适用对象的域名
Secure 仅HTTPS安全通信时才会发送Cookie;Set-Cookie:name=value; secure
HttpOnly 加以限制,使Cookie不能被JavaScript脚本访问,此属性可以防止跨站脚本攻击XSS;Set-Cookie:name=value; HttpOnly
其他首部字段
  • X-Frame-Options: DENY/SAMEORIGIN(同源)
  • X-XSS-Protection:1/0 ,0将XSS过滤设置成无效状态,1将XSS过滤设置成有效状态
  • DNT:1/0 Do Not Track 拒绝个人信息被收集,0同意被追踪,1拒绝追踪
  • P3P 用于保护用户隐私P3P