一文带你了解 HTTP 黑科技( 二 )


Accept-Charset 没有对应的标头 , 服务器会把这个值放在 Content-Type中用 charset=xxx来表示 , 
例如 , 浏览器请求 GBK 或 UTF-8 的字符集 , 然后服务器返回的是 UTF-8 编码 , 就是下面这样
Accept-Charset: gbk, utf-8Content-Type: text/html; charset=utf-8Accept-Language首部字段 Accept-Language 用来告知服务器用户代理能够处理的自然语言集(指中文或英文等) , 以及自然语言集的相对优先级 。可一次指定多种自然语言集 。和 Accept 首部字段一样 , 按权重值 q= 来表示相对优先级 。
Accept-Language: en-US,en;q=0.5Accept-Encoding表示 HTTP 标头会标明客户端希望服务端返回的内容编码 , 这通常是一种压缩算法 。Accept-Encoding 也是属于内容协商 的一部分 , 使用并通过客户端选择 Content-Encoding 内容进行返回 。
即使客户端和服务器都能够支持相同的压缩算法 , 服务器也可能选择不压缩并返回 , 这种情况可能是由于这两种情况造成的:

  • 要发送的数据已经被压缩了一次 , 第二次压缩并不会导致发送的数据更小
  • 服务器过载 , 无法承受压缩带来的性能开销 , 通常 , 如果服务器使用 CPU 超过 80%  , Microsoft 则建议不要使用压缩
下面是 Accept-Encoding 的使用方式
Accept-Encoding: gzipAccept-Encoding: compressAccept-Encoding: deflateAccept-Encoding: brAccept-Encoding: identityAccept-Encoding: *Accept-Encoding: deflate, gzip;q=1.0, *;q=0.5上面的几种表述方式就已经把 Accept-Encoding 的属性列全了
  • gzip: 由文件压缩程序 gzip 生成的编码格式 , 使用 Lempel-Ziv编码(LZ77)和32位CRC的压缩格式 , 感兴趣的同学可以读一下 (https://en.wikipedia.org/wiki/LZ77_and_LZ78#LZ77)
  • compress: 使用Lempel-Ziv-Welch(LZW)算法的压缩格式 , 有兴趣的同学可以读 (https://en.wikipedia.org/wiki/LZW)
  • deflate: 使用 zlib 结构和 deflate 压缩算法的压缩格式 , 参考 (https://en.wikipedia.org/wiki/Zlib) 和 (https://en.wikipedia.org/wiki/DEFLATE)
  • br: 使用 Brotli 算法的压缩格式 , 参考 (https://en.wikipedia.org/wiki/Brotli)
  • 不执行压缩或不会变化的默认编码格式
  • * : 匹配标头中未列出的任何内容编码 , 如果没有列出 Accept-Encoding  , 这就是默认值 , 并不意味着支持任何算法 , 只是表示没有偏好
  • ;q= 采用权重 q 值来表示相对优先级 , 这点与首部字段 Accept 相同 。
Content-TypeContent-Type 实体标头用于指示资源的 MIME 类型 。作为响应 , Content-Type 标头告诉客户端返回的内容的内容类型实际上是什么 。Content-type 有两种值 : MIME 类型和字符集编码 , 例如
Content-Type: text/html; charset=UTF-8
在某些情况下 , 浏览器将执行 MIME 嗅探 , 并且不一定遵循此标头的值;为防止此行为 , 可以将标头 X-Content-Type-Options 设置为 nosniff 。
Content-EncodingContent-Encoding 实体标头用于压缩媒体类型 , 它让客户端知道如何进行解码操作 , 从而使客户端获得 Content-Type 标头引用的 MIME 类型 。表示如下
Content-Encoding: gzipContent-Encoding: compressContent-Encoding: deflateContent-Encoding: identityContent-Encoding: brContent-Encoding: gzip, identityContent-Encoding: deflate, gzipContent-LanguageContent-Language 实体标头用于描述面向受众的语言 , 以便使用户根据用户自己的首选语言进行区分 。例如
Content-Language: de-DEContent-Language: en-USContent-Language: de-DE, en-CA下面根据内容协商对应的请求/响应标头 , 我列了一张图供你参考 , 注意其中 Accept-Charset 没有对应的 Content-Charset  , 而是通过 Content-Type 来表示 。
一文带你了解 HTTP 黑科技

文章插图
 
HTTP 认证HTTP 提供了用于访问控制和身份认证的功能 , 下面就对 HTTP 的权限和认证功能进行介绍
通用 HTTP 认证框架RFC 7235 定义了 HTTP 身份认证框架 , 服务器可以根据其文档的定义来检查客户端请求 。客户端也可以根据其文档定义来提供身份验证信息 。
请求/响应的工作流程如下:服务器以401(未授权) 的状态响应客户端告诉客户端服务器需要认证信息 , 客户端提供至少一个 www-Authenticate 的响应标头进行授权信息的认证 。想要通过服务器进行身份认证的客户端可以在请求标头字段中添加认证标头进行身份认证 , 一般的认证过程如下


推荐阅读