HTTP首部字段详解

《图解HTTP》笔记(一)

HTTP报文结构

  • 请求报文:报文首部(方法,URI,HTTP版本,HTTP首部字段),空行,报文主体
  • 响应报文:报文首部(HTTP版本,状态码,HTTP首部字段),空行,报文主体

其中首部字段包括通用首部字段,请求首部字段,响应首部字段,实体首部字段

通用首部字段

Cache-Control

字段可选,多个参数用,隔开

Cache-Conrtrol: private, max-age=0, no-cache

常用指令

  • public: 表示其他用户可以利用缓存
  • private: 响应只以特定的用户作为对象,缓存服务器会对特定的用户提供缓存服务
  • no-cache: 防止从缓存中返回过期的资源;在请求时,客户端不会接收缓存过的响应;在响应时,缓存服务器将不再进行缓存,源服务器不再对缓存服务器请求中提出的资源有效性进行确认,且禁止其响应资源进行缓存操作。
  • no-cache=location: 当no-cache指令指定具体值时,客户端接收响应报文后不能使用缓存
  • no-store: 请求中包含加密信息,不再进行缓存
  • s-maxage / max-age: 参数值为时间,判定缓存资源时间比指定时间数值小时才可以接收缓存的资源;它们之间的区别s-maxage只适用于供多位用户使用的公共缓存服务器(一般是代理)
  • min-fresh: 要求缓存服务器返回至少还未过指定时间的缓存资源(例如指定数值为60s,则在60s内如果有过期的资源无法返回)
  • max-stable: 指定时间内的资源,即使过期也接收;若未指定参数,无论过期多久都可以接收(例如指定60s,那么资源过期时间在60s内也可以接收)
  • only-if-cached: 客户端尽在缓存服务器本地缓存目标资源的情况下才会要求其返回
  • must-revalidate: 代理服务器返回前会再次向源服务器验证缓存是否有效(使用muast-revalidate后会忽略max-stable命令)
  • proxy-revalidate: 所有缓存服务器在返回缓存数据时,必须再次验证缓存的有效性
  • no-transform: 禁止缓存改变实体主体的媒体类型

Connection

常用指令

  • close: 关闭持久连接
  • keep-alive: 保持持久化连接

http 都是无连接的,所以要使用keep-alive命令保持持久连接,这个命令一般在HTTP1.0中使用,HTTP1.1默认时持久连接

Date

表示HTTP报文的创建时间

Pragma

HTTP/1.0的遗留字段,也是用于缓存控制
所以一般缓存控制时都添加两个字段:

Cache-Control: no-cache
Pragma: no-cache

Trailer

用于事先说明报文主体记录了哪些首部字段

Transfer-Encoding

规定报文主体采用的编码方式

Upgrade

用于检测HTTP协议是否可以使用更高的版本进行通信,参数值:一个不同的通信协议

Upgrade: TLS/1.0, HTTP/1.1
Connection: Upgrade

Upgrade 需要与 Connection 配合使用

via

追踪客户端与服务端之间的请求、响应报文的传输路径

Warning

告知用户关于缓存的警告信息
格式:

Warning: [警告码] [警告的主机:端口号] "[警告内容]" ([日期时间])
Warning: 113 a.baidu.com:8080 "Warning Content" Tue, 03 Jul 2012 05:09:00

常见警告码和警告内容

  • 110:Response is stale 响应已过期;代理返回已过期的资源
  • 111:Revalidation failed 再验证失败;代理再验证资源有效性时失败
  • 112:Disconnection operation 断开连接操作;代理与互联网连接被故意切断
  • 113:Heuristic expiration 试探性过期;响应的使用期超过24小时
  • 199:Miscellaneous warning 杂项警告;任意的警告内容
  • 214:Transformation applied 使用了转换;代理对内容编码或媒体类型等执行了某些处理
  • 299:Miscellaneous persistent warning 持久杂项警告;任意的警告内容

请求首部字段

Accept

客户端可以处理的媒体类型及媒体类型的优先级
常见媒体类型

  • 文本类型:text/html, text/plain, text/css, application/xhtml+xml...
  • 图片文件:image/jpeg, image/gif, image/png
  • 视频文件:video/mpeg...
  • 应用程序使用的二进制文件:application/zip...

优先级:使用参数q表示,参数值范围0-1,精确到小数点后三位,默认优先级为1

示例:

Accept: text/html,application/xhtml+xml;q=0.9, */*;q=0.8

Accept-Charset

客户端支持处理的字符集及字符集处理优先级

Accept-Charset: iso-8859-5, unicode-1-1;q=0.8

Accept-Encoding

客户端支持处理的内容编码内容编码的优先级
常见内容编码:

  • gzip: 由文件压缩程序gzip生成的编码格式,采用LZ77算法32位的CRC
  • compress: 由UNIX文件压缩程序compress生成的编码格式,采用LZW算法
  • deflate: 组合使用zlib格式及由deflate压缩算法生成
  • identity: 不执行压缩或不会变化的默认编码格式
Accept-Encoding: gzip, deflate

Accept-Language

客户端支持处理的自然语言集自然语言集的优先级

Accept-Language: zh-cn,zh;q=0.9, en-us,en;q=0.3

Authorization

用来告知服务器,用户代理的认证信息

Expect

客户端期望服务器出现的某种特定行为;
例如,等待状态码100响应的客户端在发送请求时,需要指定Expect

Expect: 100-continue

From

用来告知服务器使用用户代理的用户的电子邮件地址;其目的是为了显示搜索引擎等用户代理的负责人的电子邮件的联系方式

Host

用来告知服务器请求资源的主机名称和端口号;通常,相同IP地址下部署了多个域名,因此需要使用Host字段去理解请求的是哪个域名

Host: www.baidu.com

If-Match

条件请求,与Etag搭配使用,只有当If-Match的值与Etag值匹配时,服务器才会接受请求,否则,返回412 Percondition Failed

If-Modified-Since

条件请求,与Last-Modified搭配使用,只有当Last-Modified的时间在If-Modified-Since之后,服务器才会接受请求;即只有在If-Modified-Since字段指定的日期后资源发生了更新,服务器才会接受请求。否则,返回304 Not-Modified

//客户端
If-Modified-Since: Thu, 15 Apr 2017 00:00:00 GMT 
//服务端返回示例一
200 OK
Last-Modified: Sun, 29 Apr 2017 14:11:22 GMT
//服务端返回示例二
304 Not Modified

If-None-Match

用法与If-Match相反,不再赘述;一般,在GET或HEAD方法中使用If-None-Match可获取最新的资源,与If-Modified-Since有些类似

If-Range

只有当If-Range的值与Etag值或更新的日期时间匹配一致,这个请求可以作为范围请求处理,状态码 206 Partial Content;否则返回全部资源,状态码200;

//客户端
If-Range: "123456"
Range: bytes=5001-10000
//服务端 Etag= 123456 范围请求
206 Partial Content
Content-Range: bytes=5001-10000/10000
Content-length: 5000
//服务端 Etag= 456789 返回全部资源
200 OK
Etag: "456789"

If-Unmodified-Since

If-Modified-Since作用相反,不再赘述;即指定的资源只有在字段值指定的日期后未发生更新,才处理请求,否则返回412 Precondition Failed

Max-Forwards

指定报文可经过的服务器最大数目,每经过一个服务器,值减1,当Max-Forwards值为0时,不再进行转发,直接返回响应

Max-Forwards: 10

Proxy-Authorization

接受到代理服务器发出来的认证质询时,客户端会发送包含首部字段proxy-Authorization的请求,以告知服务器认证所需要的信息;与Authorization不同的是,认证行为发生在客户端与代理之间

Proxy-Authorization: Basic dGjwdiSDsngd5

Range

范围请求,告知服务器请求资源的指定范围,请求成功时返回206 Partial Content;若无法处理请求则返回全部资源

Range: bytes=5001-10000

Referer

告知服务器请求的原始资源的URI

TE

客户端能够处理响应的传输编码方式相对优先级,它与Accept-Encoding的区别是它是传输编码,而Accept-Encoding内容编码;

TE: gzip, deflate;q=0.5

TE的另一种用法是,指定伴随trailer字段的分块传输编码方式

TE: trailers

User-Agent

将创建请求的浏览器和用户代理名称等信息传达给服务器

响应首部字段

Accept-Ranges

告知客户端是否能处理范围请求,能处理返回值为bytes,不能则返回none

Accept-Ranges: bytes

Age

告知客户端,源服务器在多久前创建了响应,字段值单位为;若创建该响应的服务器是缓存服务器,则Age值是指缓存后的响应再次发起认证到认证完成的时间值。代理创建响应时间必须加上首部字段Age

ETag

告知客户端实体标识,是一种可将资源以字符串形式做唯一性标识的方式。当资源更新时,ETag值也会更新;

强ETag值和弱ETag值
强ETag值:实体发生任何细微的变化都会改变其值
ETag: "uasg-1234"
弱ETag值:只用于提示资源是否相同。只有资源发生根本改变,才会改变ETag值。弱ETag值会在字段最开始附加/W
ETag: W/"usag-1234"

Location

将响应接收方引导至另一个不同的资源,配合3XX:Redirection 响应,提供重定向的URI

Proxy-Authenticate

该字段会把由代理服务器所要求的认证信息发送给客户端,其认证行为是在客户端与代理之间进行的。

Proxy-Authenticate: Basic realm="Usagidesign Auth"

Retry-After

告知客户端多久之后再次发送请求,常配合503 Service Unavailable3XX Redirect响应,字段值:具体时间/秒数

Retry-After: 600

Server

告知客户端服务器上的应用程序信息

Server: Apache/2.2.17 (Unix)

Vary

用于缓存控制,在代理服务器接收到源服务器返回包含Vary指定项的响应后,仅对请求中含有相同Vary指定首部字段的请求返回缓存。
例如:

Vary: Accept-Language

当代理服务器接收到带有Vary首部字段指定获取资源的请求时,如果使用的Accept-Language字段的值相同,那么就直接从缓存返回响应;反之,则需要从源服务器端获取资源后才能作为响应返回

vary的意义在于告诉代理服务器/缓存/CDN,如何判断请求是否一样,vary中的组合就是服务器/缓存/CDN判断的依据,比如Vary中有User-Agent,那么即使相同的请求,如果用户使用IE打开了一个页面,再用Firefox打开这个页面的时候,CDN/代理会认为是不同的页面,如果Vary中没有User-Agent,那么CDN/代理会认为是相同的页面,直接给用户返回缓存的页面,而不会再去web服务器请求相应的页面。

WWW-Authenticate

用于HTTP访问认证。它会告诉客户端适用于访问请求URI所指定资源的认证方案(Basic 或 Digest)和带参数提示的质询(challenge)

WWW-Authenticate: Basic realm="Usagidesign Auth"

实体首部字段

Allow

通知客户端支持的HTTP方法;当服务器接收到不支持的HTTP方法时,会返回405 Method Not Allowed,同时会返回所有支持的方法

Allow: GET, HEAD

Content-Encoding

告知客户端服务器对实体的主体部分选用的内容编码方式

Content-Encoding: gzip

Content-Length

表示实体主体部分的大小,单位字节

Content-Location

给出与报文主体部分相对应的URI。和首部字段Location不同,Content-Location 表示的是报文主体返回资源对应的URI

Content-MD5

该字段是由一串 MD5 算法生成的值,其目的在于检查报文主体在传输过程中是否保持完整,以及确认传输到达

Content-Range

该字段针对范围请求,告诉客户端返回的实体哪个部分符合范围请求。

Content-Range: 当前发送部分/整个实体大小
Content-Range: bytes 5001-10000/10000

Content-Type

说明实体主体内对象的媒体类型,字段值用type/subtype形式赋值

Content-Type: text/html; charset=UTF-8

Expires

该字段会将资源失效的日期告诉客户端,在指定日期之间,会一直使用该资源

Expires: Wed, 04 Jul 2017 08:11:11 GMT

Last-Modified

该字段会指明资源最终修改的时间

为Cookie服务的首部字段

Set-Cookie

用于开始管理客户端状态(配置Cookie)(响应首部字段)
常用字段:

  • NAME=VALUE:赋予Cookie的名称和值
  • expires=DATE: 设置Cookie的有效期(若未设置,那有效时间和session一样)
  • path=PATH:用于限制指定Cookie的发送范围的文件目录
  • domain=域名:只有指定domain下才能使用Cookie
  • Secure:尽在HTTPS下通信才能使用Cookie
  • HttpOnly:禁止js脚本获得Cookie,防止跨站脚本攻击(XSS)
Set-Cookie: status=true; expires=Wed, 04 Jul 2017 08:11:11 GMT; path=/; domain= .baidu.com; Secure; HttpOnly;

Cookie

服务器接收到的Cookie信息(请求首部字段)

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容