http标头

2020 / 01 / 20

前言

很多人目前用http会有一种错觉,之前是用来请求资源的,html,图片之类的,现如今http主要用来请求数据的,其实不然,http最开始设计为了请求html,而后来请求更多种类的嵌入html的资源,直到现在依然只是在请求资源,请求数据的假象是因为json文件的数据格式和js的对象一毛一样导致的错误,所以http本质不会发生变化,用资源的地址定位对应的资源。

http的标头按照标头所在的位置可以分为通用标头,实体标头,请求标头和响应标头四种。

通用标头

通用表头不关心传达的信息是什么,而是关于如何传输和如何处理消息,主要有

  • cache-control
  • connection
  • via
  • transfer-encoding
  • date
  • pragma
  • upgrade

缓存是网络中非常重要的性能优化手段之一,通过控制缓存来优化http的传输效率也是最常见的http优化方法之一。

cache-control

cache-control相对比较复杂,它也提供了一系列的指令,分为

缓存请求指令,包括max-age, max-stale, min-fresh, no-cache, no-store, no-transform, if-only-cached

缓存响应指令,包括must-revalidate, no-cache, no-store, no-transform, public, private, proxy-revalidate, max-age, s-maxage

扩展指令 immutable, stale-while-revalidate, stale-if-error

connection

http1.1之后通过建立持久的TCP连接来减少建立链接的次数从而优化网络性能,默认keep-alive,通常会和keep-alive的请求头一起用

via

记录经过的代理服务器的路径,通常和trace一起用

date

记录请求的时间和响应的时间,是个格林威治时间。

transfer-encoding

标头也可以分为逐条首部和端到端首部,逐条首部用于不同节点间的传输,在不同节点之间的值可能是不同的,transfer-encoding是不同的,transfer-encoding有gzip, deflate, compress, chunked, identity

upgrade

// 出现在什么时候?客户端告诉服务端该升级了?

请求标头

请求标头主要是用来告诉另一方自己的信息和一些需要的东西,自己的信息有user-agenet, rederer, host, authentication,用来做内容协商的有accept, accept-language, accept-encoding, accept-charset, expect, user-agent也可以做内容协商用,

  • accept
  • accept-language
  • accept-encoding
  • accept-charset
  • user-agent
  • expect
  • host
  • authorization
  • if-match
  • if-none-match
  • if-modified-since
  • if-unmodified-since
  • if-range
  • range
  • referer
  • cookie

accept

告诉服务端自己要接受的MINE类型,比如文本,图片,二进制等,text/html,

accept-language

告诉服务端自己期望得到的文件类型的语言格式,比如多多语言程序时候,就需要根据不同的accept-language返回不同的内容

accept-encoding

接受的编码类型,包括gzip, deflate, compress, br等。

accept-charset

接受的字符集类型

accept类型的请求头都可以增加权重值来供服务器更好的支持,比如接受的语言更倾向于英语,当然汉语也可以,请求头就可以写作

accept-language: en-US,en;q=0.9, zh-CN,zh;q=0.4

user-agent

用户代理,告诉服务端客户端使用的代理的类型

以上的这些都属于内容协商的一些请求头,在js脚本还不太流行的web发展早期,更多的是通过内容协商的方式来实现多样化的页面展示的,而且这些请求头可以更方便代理工作。

Expect

客服端如果对服务器的能力有要求的话,可以通过expect来勘探服务器的能力,如果不满足就会 417 Expectation Failed,满足就会返回100 Continue,客户端就可以继续完成下一步的任务了。

Authentication

用来让服务器检查用户凭证的请求标头

Host

服务器的域名,host是http1.1规范中唯一一个必须包含的请求标头

if-match

if开头的请求用于

if-none-match

匹配服务端的Etag,如果没有匹配到对应的tag才会执行响应,否则返回304。翻译一下就是说客户端问服务端如果没有一个匹配到的话,就响应请求,服务端说回复一个304表示匹配到了。

if-modified-since

匹配服务端的更新时间,如果比服务端资源标记的last-modify-since大的话,说明文件被修改了,就会执行响应,否则返回304。翻译一下就是资源自从10月5号之后被修改了的话返回新的,服务端看了一下自己的last-modify-since

if-none-match比If-modified-since优先级更高,同时存在的话if-modified-since会被忽略,除非服务端不支持e-tag。

if-unmodified-since

表示资源如果在一个时间内没有发生更改才会返回,如果被更改了,就不是客户端需要的资源,会返回412 Precondition Failed

if-range

如果这个范围存在的话返回范围内的资源,否则返回全部资源。

range

请求的范围,对视频音乐等资源请求的时候,通常是一部分一部分请求的,如果范围存在会返回206,如果不存在会返回416 Range not satisfiable

renferer

请求来自的网页链接

cookie

携带用户cookie

响应标头

  • access-control-allow-origin
  • access-control-allow-method
  • access-control-allow-credential
  • vary
  • www-authenticate
  • proxy-authenticate
  • server
  • retry-after
  • location

响应标头分类一下,首先是缓存用的Etag,然后是cors控制用的access-control开头的,然后是辅助内容协商用的vary,然后是鉴权用的www-authenticate和proxy-authenticate,然后是服务端信息server,然后是retry-after和location,配合客户端后续响应的。

Access-Control-Allow-Origin

cors用,告诉客户端自己允许的域

Access-Control-Allow-Methods

cors用,告诉客户端自己允许的方法

Access-Control-With-Credential

cors用,告诉客户端是否允许携带cookie

server

原始服务器的信息

server: nginx/1.12.2

authenticate

原始服务器的认证方法,一般和401一起返回,告诉客户端没权限的同时,告诉他应该用什么认证。

proxy-authenticate

代理服务器的认证方法,一般和401一起返回,告诉客户端没权限的同时,告诉他应该用什么认证。

set-cookie

在客户端设置cookie,可以设置的同时设置cookie的属性,包括http-only,expires, max-age, path, domain, secure等属性值

vary

告诉客户端资源是随着哪些标头变化而可变的,比如手机端和PC的响应不同,就会用到,当然它也可以指定多个值。表明服务端在做内容协商的时候,是用哪些标头协商的。

Vary: User-Agent

location

重定向的时候用的,和3xx和201已创建一起使用

retry-after

当发生503服务不可用,429请求太多,301永久移动的时候服务端需要告诉客户端多久后来重试,这个时候会包含这个标头,标头的值可以是个时间点,也可以是多少秒后

实体标头

实体标头有6个是带着content的,然后2个是表示文件的过期和修改时间相关的。

  • etag
  • expires
  • last-modified
  • content-length
  • content-range
  • content-language
  • content-encoding
  • content-location
  • content-type

etagdodo

这个东西的重要性就不说了,用来给资源打指纹的

content-length

内容的大小

content-type

内容的类型

content-language

语言

content-encoding

编码方式

content-location

内容的URL,以后不需要协商就可以直接通过content-location访问资源

content-range

Content-Range: bytes 200-1000/67589 

上述的响应体表示,返回的资源共有67589bytes,这次返回了200-1000bytes

last-modified

资源上次修改时间

expires

资源的过期时间,比起资源的expires,代理会优先处理cache-control的max-age

写评论
全部评论
暂无评论