Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

HTTP —— 首部字段 #6

Open
Heqingsong opened this issue Aug 15, 2019 · 0 comments
Open

HTTP —— 首部字段 #6

Heqingsong opened this issue Aug 15, 2019 · 0 comments

Comments

@Heqingsong
Copy link
Owner

HTTP请求和响应报文中必定会包含HTTP首部。首部内容为客户端和服务器分别处理请求和响应提供了所需要的信息。

HTTP请求报文
请求报文由方法、URI、HTTP版本、HTTP首部字段等部分构成

HTTP响应报文
在响应中,HTTP报文由HTTP版本、状态码、HTTP首部字段构成

4种HTTP首部字段类型

  • 通用首部字段(General Header Fields)
  • 请求首部字段(Request Header Fields)
  • 响应首部字段(Response Header Fields)
  • 实体首部字段(Entity Header Fields)

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 服务器对客户端的认证信息

实体首部字段

首部字段名 说明
Allow 资源可支持的HTTP方法
Content-Encoding 实体主体适用的编码方式
Content-Language 实体主体的自然语言
Content-Length 实体主体的大小(单位:字节)
Content-Location 替代对应资源的URI
Content-MD5 实体主体的报文摘要
Content-Range 实体主体的位置范围
Content-Type 实体主体的媒体类型
Expires 实体主体过期的日期时间
Last-Modified 资源的最后修改日期时间

非HTTP/1.1首部字段

Cookie、Set-Cookie、Content-Disposition

其他首部字段(非标准)

X-Frame-Options、X-XSS-Protection、DNT、P3P

End-to-end、Hop-by-hop

HTTP首部字段将定义成缓存代理和非缓存代理的行为,分成两种类型:

端到端首部(End-to-end Header)
分在此类别中的首部会转发给请求/响应对应的最终接收目标,且必须保存在由缓存生成的响应中,另外规定它必须被转发。

逐跳首部(Hop-by-hop Header)
分在此类别中的首部只对单次转发有效,会因通过缓存或代理而不再转发。

HTTP/1.1通用首部字段详解

Cache-Control

通过指定首部字段Cache-Control的指令,就能操作缓存的工作机制。指令的参数是可选的,多个指令之间通过","分割。

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

缓存指令一览

指令 参数 说明
no-cache 强制向源服务器在此验证
no-store 不缓存请求或响应的任何内容
max-age=[秒] 必需 响应的最大Age值
max-stale(=[秒]) 可省略 接收已过期的响应
min-fresh=[秒] 必需 期望在指定时间内的响应仍有效
no-transform 代理不可更改媒体类型
only-if-cached 从缓存获取资源
cache-extension - 新指令标记(token)

缓存响应指令

指令 参数 说明
public 可向任意方提供响应的缓存
private 可省略 仅向特定用户返回响应
no-cache 可省略 缓存前必须先确认其有效性
no-store 不缓存请求或响应的任何内容
no-transform 代理不可更改媒体类型
must-revalidate 可缓存但必须再向源服务器进行确认
proxy-revalidate 要求中间缓存服务器对缓存的响应有效性再进行确认
max-age=[秒] 必需 响应的最大Age值
s-maxage=[秒] 必需 公共缓存服务器响应的最大Age值
cache-extension - 新指令标记(token)

表示是否能缓存的指令

public指令

Cache-Control:public

当指定使用public指令时,则明确表明其他用户也可利用缓存。

private指令

Cache-Control:private

当指定使用private指令后,响应只以特定的用户作为对象。

no-cache指令

Cache-Control:no-cache

使用no-cache指令的目的是为了防止从缓存中返回过期的资源。

控制可执行缓存对象的指令

no-store指令

Cache-Control:no-store

当使用no-store指令时,暗示请求或响应中包含机密信息。因此,该指令规定缓存不能在本地存储请求或响应的任一部分。

指定缓存期限和认证的指令

s-maxage指令

Cache-Control:s-maxage=608000(单位:秒)

s-maxage指令的功能和max-age指令相同,不同之处在于s-maxage指令只适用与供多位用户使用的公共缓存服务器(代理服务器)。

max-age指令

Cache-Control:max-age=608000(单位:秒)

如果发送的请求中包含max-age指令时,如果判定缓存资源的缓存时间数值比指定时间的数值更小,那么客户端就接收缓存的资源。如果指定值为0,那么缓存服务器通常需要将请求转发给源服务器。

min-fresh指令

Cache-Control:min-fresh=8000(单位:秒)

min-fresh指令要求缓存服务器返回至少还未过指定时间的缓存资源。

max-stale指令

Cache-Control:max-stale=8000(单位:秒)

使用max-stale可指示缓存资源,即使过期也照常接收。

only-if-cached指令

Cache-Control:only-if-cached

使用only-if-cached指令表示客户端仅在缓存服务器本地缓存目标资源的情况下才会要去其返回。若发送请求缓存服务器的本地缓存无响应,则返回状态码_504Gateway Timeout_

must-revalidate指令

Cache-Control:must-revalidate

使用must-revalidate指令,代理会向源服务器再次验证即将返回的响应缓存目前是否仍然有效。若代理无法连通源服务器再次获取有效资源的话,缓存必须给客户端一条_504Gateway Timeout_状态码。另外使用了must-revalidate指令会忽略请求的max-stale指令。

proxy-revalidate指令

Cache-Control:proxy-revalidate

proxy-revalidate指令要求所有的缓存服务器在接收到客户端带有该指令的请求返回响应之前,必须再次验证缓存的有效性。

no-stransform指令

Cache-Control:no-stransform

使用no-stransform指令规定无论是在请求还是响应中,缓存都不能改变实体主体的媒体类型。这样做可防止缓存或代理压缩图片等类似操作。

Cache-Control扩展

cache-extension token

Cache-Control:private, suix='23'

使用cache-extension标记token,可扩展Cache-Control首部字段内的指令,如果缓存服务器不能理解suix这个指令,就会直接忽略,如果理解对缓存服务器来说是有意义的。

Connection

Connection有两个作用

  1. 控制不再转发给代理的首部字段

Connection:不再转发的首部字段名

  1. 管理持久连接

Connection:close

HTTP/1.1之前默认连接都是非持久连接,想再旧版本的HTTP协议上维持持续连接,需要指定Connection字段的值为Keep-Alive

Date

首部字段Date表明创建HTTP报文的日期和时间

Date:Tue, 03 Jul 2015 12:12:12 GMT

Pragma

Pragma是HTTP/1.1之前版本的历史遗留字段,仅作为与HTTP/1.0向后兼容而定义,该首部字段表示要求所有的中间服务器不返回缓存的资源。

Pragma:no-cache

Trailer

首部字段Trailer会事先说明在报文主体后记录了那些首部字段,该首部字段可应用在HTTP/1.1版本分块传输编码时

Trailer: Expires
Expires: Tue, 28 Sep 2015 23:59:59 GMT

Transfer-Encoding

首部字段Transfer-Encoding规定了传输报文主体时采用的编码方式。HTTP/1.1的传输编码方式仅对分块传输编码有效。

Transfer-Encoding: chunked

Upgrade

首部字段Upgrade用于检测HTTP协议及其他协议是否可使用更高的版本进行通信,其参数值可以用来指定一个完全不同的通信协议。

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

Connection的值被指定为Upgrade,该字段产生作用的Upgrade对象仅限于客户端和邻接服务器之间。使用首部字段Upgrade的时候还需要单独指定Connection的值为Upgrade,对于附有首部字段Upgrade的请求,服务器可用101 Switching Protocols状态码作为相应返回。

Via

首部字段Via是为了追踪客户端与服务器之间的请求和响应报文的传输路径。首部字段Via不仅用于追踪报文的转发,还可避免请求回环的发生,所以必须在经过代理时附加该首部字段内容。

Via: 1.0 www.baidu.com(Squid/3.1)

Warning

Warning首部是从HTTP/1.0的相应首部演变过来的,该首部通常会告知用户一些与缓存相关的问题的警告。

Warning: 113 www:baidu.com:8080 "有一个非法访问" Tue,03 Jul 2015 12:12:12 GMT
Warning: [警告码][警告的主机:端口]警告内容

HTTP/1.1警告码

警告码 警告内容 说明
110 Response is stale(响应过期) 代理返回已过期的资源
111 Revalidation failed(再次验证失败) 代理再验证资源有效性时失败(服务器无法到达等原因)
112 Disconnection operation(断开连接操作) 代理与互联网连接被故意切断
113 Heuristic expiration(试探性过期) 响应的使用期超过24小时(有效缓存时间大于24小时的情况下)
199 Miscellaneous warning(杂项警告) 任意的警告内容
214 Transformation applied(使用了转换) 代理对内容编码或媒体类型等执行了某些处理时
299 Miscellaneous persistent warning(持久杂项警告) 任意的警告内容

Accept

Accept首部字段可通知服务器,用户代理能够处理的媒体类型及媒体类型的相对优先级。可用type/subtype这种形式,一次性指定多个媒体类型。若要想给媒体类型设置优先级可使用**q=**来设置,使用(;)号分隔,范围为(0~1),默认权重为q=0.1

Accept: text/html,application/xml;q=0.9

例:

文本文件

text/html,text/plain,text/css

图片文件

image/jpeg,image/gif,image/png

视频文件

video/mpeg,video/mp4

二进制文件

application/octet-stream,application/zip

Accept-Charset

Accept-Charset 首部字段可用来通知服务器用户代理支持的字符及字符集的相对优先顺序。

Accept-Charset: ios-8859-1,gbk;q=0.8

Accept-Encoding

Accept-Encoding首部字段用来告知服务器用户代理支持的内容编码及内容编码的优先顺序,可一次性指定多个内容编码。

Accept-Encoding: gzip,deflate

例:

  • gzip
  • compress
  • deflate
  • identity

Accept-Language

首部字段Accept-Language用来告知服务器用户代理能够处理的自然语言集,以自然语言集的相对优先级。

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

Authorization

首部字段Authorization是用来告知服务器,用户代理的认证信息。

Authorization: Basic fcvrgafVGDSEGfsdahsg==

Expect

客户端使用首部字段Expect来告知服务器,期望出现的某种特定行为,若服务器无法理解会返回417 Expectation Failed

Expect: 100-continue

From

首部字段From用来告知服务器使用用户代理的用户的电子邮件地址。

From: [email protected]

Host

首部字段Host会告知服务器,请求的资源所处的互联网主机名和端口号。在HTTP/1.1的版本中Host字段必须被包含。

Host: www.google.com

if-Match

形如像if-xxx这种形式的请求首部字段,都可以称为条件请求。服务器接收到附带条件的请求后,只有判断指定条件为真时,才会执行请求。

if-Match: "suix"

首部字段if-Match属附带条件之一,它会告知服务器匹配资源所用的实体标记ETag值

if-Modified-Since

首部字段if-Modified-Since,属附带条件之一,它会告知服务器if-Modified-Since字段值早于资源更新的更新时间,则希望能处理该请求。如果资源没有更新过则返回状态码304 Not Modified的响应。

if-Modified-Since: Thu,15 Apr 2015 00:00:00 GMT

if-None-Match

首部字段if-None-Match,属附带条件之一,它与if-Match作用相反,与ETag不一致时,它就告知服务器处理该请求。

if-None-Match: *

if-Range

首部字段if-Range属于附带条件之一。它告知服务器若指定的if-Range字段值(ETag值或时间)和请求资源的ETage值或时间相一致时,则作为范围请求处理。

if-Range: "123456"
Range:bytes=500-1000

if-Unmodified-Since

首部字段if-Unmodified-Since和首部字段if-Modified-Since的作用相反。它的作用是告知服务器,指定的请求资源只有在字段值内指定的日期时间之后,未发生更新的情况下,才能处理请求。

if-Unmodified-Since: Thu,03 Jul 2015 00:00:00 GMT

Max-Forwards

通过TRACE方法或OPTIONS方法,发送包含首部字段Max-Forwards的请求时,该字段以十进制整数形式指定可经过的服务器最大数目

Max-Forwards: 10

Proxy-Authorization

客户端发送包含首部字段Proxy-Authorization的请求时,以告知服务器认证所需要的信息。

Proxy-Authorization: Basic dGfdaDfgjoiuoireCCD

Range

对于只需要获取部分资源的范围请求,包含首部字段Range即可告知服务器资源的指定范围。

Range: bytes=5001-1000

Referer

首部字段Referer会告知服务器请求的原始资源的URI

Referer: http://www.google.com/index.html

TE

首部字段TE会告知服务器客户端能够处理响应的传输编码方式及相对优先级。

TE: gzip,deflate;q=0.5

User-Agent

首部字段User-Agent会将创建请求的浏览器和用户代理名称等信息传达给服务器

User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/600.1.3 (KHTML, like Gecko) Version/8.0 Mobile/12A4345d Safari/600.1.4

Accept-Ranges

首部字段Accept-Ranges是用来告知客户端服务器是否能处理范围请求,以指定获取服务器某个部分的资源。可处理返回范围请求时指定其为bytes,反之则指定其为none

Accept-Ranges: bytes

Age

首部字段Age能告知客户端,源服务器在多久前创建了响应,单位为毫秒

Age: 600

ETag

首部字段ETag能告知客户端实体标识。它是一种可将资源以字符串形式做唯一性标识的方式。

ETag: usagi-abcd

强ETag值

强ETge值,不论实体发生多么细微的变化都会改变其值。

ETag: "usagi-1234"

弱ETag值

只有资源发生了根本改变才会改变ETag值

ETag: W/"usagi-1234"

Location

使用首部字段Location可以将响应接收方引导至某个与请求URI位置不同的资源。该字段会配合3xx:Redirection的响应。

Location: http://www.google.com/index.html

Proxy-Authenticate

该首部字段Proxy-Authenticate会把由代理服务器所要求的认证信息发送给客户端。

Proxy-Authenticate: Basic realm="Usagidesign Auth"

Retry-After

首部字段Retry-After告知客户端应该在多久之后再次发送请求。主要配合503 Service Unavailable响应3xx Redirect响应

Retry-After: 120

Server

首部字段Server告知客户端当前服务器上安装的HTTP服务器应用程序的信息。

Server: Apache/2.2.17 (Unix) PHP/5.2.5

Vary

首部字段Vary可对缓存进行控制。如果代理服务器接收到带有Vary首部字段指定获取资源的请求时,如果使用的Accept-Language字段的值相同,那么就直接从缓存返回响应。

Vary: Accept-Language

WWW-Authenticate

首部字段WWW-Authenticate用于HTTP访问认证。它会告知客户端适用于访问请求URI所指定的认证方案(Basic或Digest)和带参数提示的质询。状态码401 Unauthorized响应中,肯定带有首部字段WWW-Authenticate。

WWW-Authenticate: Basic realm="Usagidesign Auth"

Allow

首部字段Allow用于通知客户端能够支持Request-URI指定资源的所有HTTP方法。当服务器接收到不支持的HTTP方法的时候,会以状态码405 Method Not Allowed作为响应返回,同时会返回能支持的方法写入首部字段Allow后返回。

Allow: GET, HEAD

Content-Encoding

首部字段Content-Encoding会告知客户端服务器对实体的主体部分选用的内容编码方式。

Content-Encoding: gzip

Content-Language

首部字段Content-Language会告知客户端,实体主体使用的自然语言

Content-Language: zh-CN

Content-Length

首部字段Content-Length表明了实体主体部分的大小(单位字节)。

Content-Length: 1500

Content-Location

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

Content-Location: http://www.google.com/index.html

Content-MD5

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

Content-MD5: OGIEJIMKVNKNLNIWPJJPQNJKNXSJKANXZ==

Content-Range

首部字段Content-Range用于范围请求,服务器返回响应时使用首部字段Content-Range,能告知客户端作为响应返回的实体的那个部分符合范围请求。

Content-Range: bytes 5001 - 100000/100000

Content-Type

首部字段Content-Type说明了实体主体内对象的媒体类型。

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

Expires

首部字段Expires会将资源失效的日期告知客户端

Expires: Wed, 04 Jul 2016 08:26:05 GMT

Last-Modified

首部字段Last-Modified指明资源最终修改的时间。

Last-Modified: Wed, 23 May 2016 09:09:09 GMT

Set-Cookie

服务端设置cookie信息到客户端

Set-Cookie:status=enable; expires=Sun, 03-Jan-16 21:52:35 GMT; domain=www.baidu.com; path=/

expires属性
Cookie的expires属性指定浏览器可发送Cookie的有效期。当省略的时候,其有效期仅限于维持浏览器会话时间段内。

path属性
Cookie的path属性可用于限制指定的Cookie的发送范围的文件目录。

domain属性
通过Cookie的domain属性指定的域名可做到与结尾匹配一致。

secure属性
Cookie的secure属性用于限制web页面仅在HTTPS安全连接时,才可以发送Cookie。

HttpOnly属性
Cookie的HttpOnly属性是Cookie的扩展功能,它使JS无法获得Cookie。其主要目的为防止跨站脚本攻击。

X-Frame-Options

首部字段X-Frame-Options属于HTTP响应首部,用于控制网站内容在其他web网站的Frame标签内的显示问题。主要目的是为了防止点击劫持攻击。

X-Frame-Options: DENY

有两个取值:DENY表示拒绝,SAMEORIGIN表示仅在同源域名下的页面匹配时许可。

X-XSS-Protection

首部字段X-XSS-Protection属于HTTP响应首部,它是针对跨站脚本攻击(XSS)的一种对策,用于控制浏览器XSS防护机制的开关。有两个取值:0表示无效,1表示有效。

X-XSS-Protection: 1

X-Forwarded-For

X-Forwarded-For 是一个扩展头。它最开始是由Squid这个缓存代理软件引入,用来表示HTTP请求端真实IP,现在已经成为事实上的标准,被各大 HTTP 代理、负载均衡等转发服务广泛使用。

X-Forwarded-For: client, proxy1, proxy2

X-Powered-By

扩展头X-Powered-By这个不是Apache或者Nginx输出的,而是由语言解析器或者应用程序框架输出的。这个值的意义用于告知网站是用何种语言或框架编写的。

X-Powered-By:Express

DNT

首部字段DNT属于HTTP请求首部,其中DNT是Do Not Track的简称,意为拒绝个人信息被收集,是表示拒绝被精准广告跟踪的一种方法。有两个取值:0同意被追踪,1拒绝被追踪。

DNT: 1

P3P

首部字段P3P属于HTTP响应首部,通过利用P3P技术,可以让web网站上的个人隐私变成一种仅供程序可以理解的形式,以达到保护用户隐私的目的。

P3P: CP=/"CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR/"

Strict-Transport-Security

首部字段Strict-Transport-Security简称为HSTS,它允许一个HTTPS网站,要求浏览器总是通过HTTPS来访问它。

strict-transport-security: max-age=16070400; includeSubDomains

includeSubDomains是可选的,用来指定是否作用于子域名。支持HSTS的浏览器遇到这个响应头,会把当前网站加入HSTS列表,然后在max-age指定的秒数内,当前网站所有请求都会被重定向为https。即使用户主动输入http://或者不输入协议部分,都将重定向到https://地址。

X-Content-Type-Options

互联网上的资源有各种类型,通常浏览器会根据响应头的Content-Type字段来分辨它们的类型。例如:"text/html"代表html文档,"image/png"是PNG图片,"text/css"是CSS样式文档。然而,有些资源的Content-Type是错的或者未定义。这时,某些浏览器会启用MIME-sniffing来猜测该资源的类型,解析内容并执行。

X-Content-Type-Options: nosniff

Content-Security-Policy

这个规范与内容安全有关,主要是用来定义页面可以加载哪些资源,减少XSS的发生。

Content-Security-Policy: default-src 'self'

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant