BeWithYou

胡搞的技术博客

  1. 首页
  2. 数据结构/实用算法/知识
  3. HTTP知识(2)-HTTP首部

HTTP知识(2)-HTTP首部


HTTP知识(2)-HTTP首部

HTTP请求和响应中必定有首部,我们做WEB开发时最常接触到的HTTP知识就是首部各字段了。这里详细记录一下HTTP首部结构和各个字段的用法。

HTTP报文首部结构

请求报文

  • 请求报文由请求行(方法、URI、HTTP版本)+HTTP首部字段(请求首部字段、通用首部字段、实体首部字段)+其他组成。空行(CR+LF)分隔首部与报文主体。
  • 响应报文由状态行(HTTP版本、状态码)+HTTP首部字段(响应首部字段、通用首部字段、实体首部字段)组成。空行(CR+LF)分隔首部与报文主体。

HTTP报文首部字段(HTTP/1.1)

通用首部字段一览

首部字段名称 说明
Cache-Control 控制缓存的行为
Connection 逐跳首部、连接的管理
Date 创建报文的日期时间
Pragma 报文指令
Trailer 报文末端的首部一览
Transfer-Encoding 指定报文主体的传输编码方式
Upgrade 升级为其他协议
Via 代理服务器的相关信息
Warning 错误通知

请求首部字段一览

首部字段名称 说明
Accept 用户代理可处理的媒体类型
Accept-Charset 优先的字符集
Accept-Encoding 优先的内容编码
Accept-Language 优先的语言(自然语言)
Authorization Web认证信息
Expect 期待服务器的特定行为
From 用户的电子邮箱地址
Host 请求资源所在服务器
If-Match 比较实体标记(ETag)
If-Modified-Since 比较资源的更新时间
If-None-Match 比较实体标记(与If-Match相反)
If-Range 资源未更新时发送实体Byte的范围请求
If-Unmodified-Since 比较资源的更新时间(与If-Modified-Since相反)
Max-Forwards 最大传输逐跳数
Proxy-Authorization 代理服务器要求客户端的认证信息
Range 实体的字节范围请求
Referer 对请求中URI的原始获取方
TE 传输编码的优先级
User-Agent HTTP客户端程序的信息

响应首部字段一览

首部字段名称 说明
Accept-Ranges 是否接受字节范围请求
Age 推算资源创建经过时间
ETag 资源的匹配信息
Location 令客户端重定向至指定URI
Proxy-Authenticate 代理服务器对客户端的认证信息
Retry-After 对再次发起请求的时机要求
Server HTTP服务器的安装信息
Vary 代理服务器缓存的管理信息
WWW-Authenticate 服务器对客户端的认证信息

非HTTP/1.1首部字段

  • 还有经常用到的字段,不属于RFC2616中的。Cookie,Set-Cookie,Content-Disposition

端到端首部与逐跳首部

  • 端到端首部(End-to-end Header),会被转发给最终接收目标,并且必须保存在由缓存生成的响应中。
  • 逐跳首部(Hop-by-hop Header),只对单次转发有效,会因为通过缓存或者代理不会继续转发。
  • 8个逐跳首部:Connection,Keep-Alive,Proxy-Authenticate,Proxy-Authorization,Trailer,TE,Transfer-Encoding,Upgrade

常用首部字段介绍

列举一下常用的首部字段,及其常用的值。每个首部字段有很多可能取值,可以用逗号分隔开。

通用首部字段

  1. Cache-Controll
    • public 所有人都可以使用缓存
    • private 只可为特定用户提供缓存
    • no-cache 客户端带这个,表明不需要缓存过资源。服务端带这个表示自己不提供缓存资源。
    • no-store 真正的不进行缓存,上面的no-cache只是不缓存过期资源
    • max-age 保存为缓存的最大秒
    • min-fresh 要求缓存服务器返回至少未过指定描述的缓存资源。
  2. Connection
    • 不再转发的首部字段名,强制这个字段不能转发
    • closed 服务器明确表示断开连接
    • Keep-Alive 持久连接
  3. Date 创建报文的时间
  4. Tansfer-Encoding 编码方式 如chunked

请求首部字段

  1. Accept 通知服务器可以接受的媒体类型和优先级,可以用q=x表示权重
    • text/html,text/plain,text/css,application/xhtml+xml,application/xml
    • image/jpeg
    • video/mpeg
    • application/octet-stream
  2. Accept-Charset 通知服务器可以接受的字符编码和优先级,可以用q=新表示权重
    • ios-8859-5
    • UTF-8
  3. Accept-Encoding 通知服务器可以接受的内容编码和优先级
    • gzip
    • deflate
    • compress
    • identity
  4. Accept-Language 通知服务器可以接受的语言的优先级
    • zh-cn
    • en-us
  5. Authorization 通知服务器用户代理的认证信息,通常在收到401之后会加上
  6. Host 请求的具体主机名和端口号,用于同一个ip上绑定了多个域名。这是HTTP/1.1规定的唯一的必须有的首部字段
  7. Max-Forwards 使用TRACE或OPTIONS方法时,没经过一个服务器Max-Forwards的值-1,为零时不再转发直接返回响应。
  8. Range 请求范围内的资源,常用语断点续传。如果成功了,则返回206的状态码
    • bytes=1000-1500
  9. Refer 通知服务器请求原始资源的URI,比如从/a.html跳到/b.html,则会带上/a.html的Refer。从浏览器直接输入网址进入的情况下,Refer为空
  10. User-Agent 浏览器和用户代理信息

响应首部字段

  1. Accept-Ranges 是否接受范围请求
    • bytes 可以,并且按字节来
    • none 不行
  2. Age 告诉客户端这个资源是源服务器在多少秒创建的
  3. Etag 告诉客户端这个资源可以以Etag为标识唯一识别,资源更新时Etag也会更新
  4. Location 可以将页面引导去一个与请求不同的URI
  5. Retry-After 告诉客户端多少秒后再来访问
  6. Server 告诉客户端服务器的HTTP服务应用程序的信息,比如Apache,IIS,Tomcat等

实体首部字段

  1. Allow 通知客户端可以使用的HTTP方法 如GET POST等
  2. Content-Encoding 告知客户端实体的主体部分编码
    • gzip
    • deflate
    • compress
    • identity
  3. Content-Language 告知客户端实体主体使用的自然语言 如zh-cn
  4. Content-Length 告知客户端实体主体部分的大小是多少字节
  5. Content-Location 告知客户端主体部分对应的URI,比如给了Location与请求的URI不一样,这里会给出实际的
  6. Content-Range 告知客户端返回的实体主体对应的字节范围
    • bytes 1000-1500/2000 返回的是总共2000字节中的1000到1500
  7. Content—Type 说明实体主体内对象的媒体类型,与Accept对应。另外可附加chaset=UTF-8这样的字符集说明。
    • text/html; charset=UTF-8
  8. Expires 告知客户端这个资源的失效时间,与Date相同时表示不想让客户端缓存本次资源。
  9. Last-Modified 告知客户端这个资源最终修改的时间

Cookie相关首部字段

  1. Set-Cookie 服务端告诉客户端需要设置Cookie
属性 说明
NAME=VALUE 赋予Cookie的名称和其值(必需项)
expires=DATE Cookie的有效期(若不明确指定则默认为浏览器关闭前为止)
path=PATH 将服务器上的文件目录作为Cookie的适用对象(若不指定则默认为文档所在的文件目录)
domain=域名 作为Cookie适用对象的域名(若不指定则默认为创建Cookie的服务器的域名)
Secure 仅在HTTPS安全通信时才会发送Cookie
HttpOnly 加以限制,使Cookie不能被JavaScript脚本访问
  1. Cookie 告诉服务端本次请求带Cookie信息

其他非标准首部字段

  1. X-Frame-Options 控制页面其他网站的Frame显示
    • DENY 拒绝
    • SAMEORIGIN 只显示同源域名下的
  2. X-XSS-Protection 控制浏览器XSS防护机制开关 0关 1开
  3. DNT 控制客户端信息能否被追踪 0同意 1拒绝
  4. P3P 告知客户端个人隐私可以被其他程序理解,比如Cookie可以被其他不同域的页面读取,通常用来实现跨站登录
回到顶部