当前位置: 首页 > 编程日记 > 正文

标头“Vary:Accept-Encoding”指定方法及其重要性分析

原文地址:http://www.webkaka.com/blog/archives/how-to-set-Vary-Accept-Encoding-header.html

在webkaka的网站速度诊断性能优化里有一项叫指定“Vary:Accept-Encoding”标头,可能很多人不太明白这是什么意思,不知道它对网站的影响有多大,不知道如何进行优化,为此,本文将给大家阐述下“Vary:Accept-Encoding”标头的意义以及设置方法。

指定“Vary:Accept-Encoding”标头

指定“Vary:Accept-Encoding”标头

指定“Vary: Accept-Encoding”标头的意义

指定“Vary: Accept-Encoding”标头,用一句话来说明它的意义,就是“告诉代理服务器缓存两种版本的资源:压缩和非压缩,这有助于避免一些公共代理不能正确地检测Content-Encoding标头的问题。”不过我想很多人都不理解这句话是什么意思,所以需要更详细的解释。

先来看看下面这幅图:

网页从请求到响应的过程

网页从请求到响应的过程

这个图显示了一个网页从请求到响应的过程。正常情况下,“Response”的结果是可读文本,但并不是所有的服务器端都返回这样的正常的结果到用户端,有的返回一堆乱码,这显然是不正常的。

当浏览器发出一个请求时,会包含一些HTTP头信息,服务器会根据这些头信息决定返回什么样的东西(这是一个移动客户端吗?它能否处理压缩内容?它是否需要特定的语言支持?)。

直接访问是好的,但现在网络使用了中间高速缓存(cache)和内容分发网络(CDN)。这就产生了一个问题,缓存如何使用头信息决定返回什么?它能否复制服务器端的决策逻辑?

“Vary”解决了这个问题,“Vary”头描述什么信息“唯一地”标识一个请求——传入的请求只有完全匹配缓存的“Vary”信息,缓存才被使用。

假如没有“Vary”头,那么如果由于某种原因,客户端有一个未压缩的版本在其缓存中的文件,它会不知道随后再次要求它的压缩版本,而不是只从缓存中使用未压缩的文件。——这就很好的解释了“Vary”头信息的重要意义。

设想有两个客户,一个使用的旧浏览器不支持压缩,一个使用新的浏览器支持压缩,如果他们都请求同一个网页,那么取决于谁先请求,压缩或非压缩版本便存储在CDN上。这样问题就出现了,旧浏览器请求常规网页但获得缓存的压缩版本,而新浏览器会获得缓存的非压缩版本但尝试去“解压”它。无论哪种方式都是坏消息。解决方法是,源服务器回送“Vary: Accept-Encoding”。

现在的中间CDN会存储独立的缓存条目,一个是Accept-encoding: gzip ,而如果你没有发送header,则存储另一个。

标头“Vary:Accept-Encoding”指定方法

现在的新浏览器都支持压缩了,因此如果网站启用了GZip,可以无需再指定“Vary: Accept-Encoding”标头,不过指定“Vary: Accept-Encoding”标头会有更高的保险,而它并不需要你额外的开销,为什么不指定呢?下面是设置方法:

Apache/.htaccess

<IfModule mod_headers.c>
        <FilesMatch ".(js|css|xml|gz|html)$">
          Header append Vary: Accept-Encoding
        </FilesMatch>
      </IfModule>

Nginx

gzip_vary on

IIS

在web.config里加上如下配置,web.config位置在:%windir%\Microsoft.NET\Framework\.net版本号\CONFIG\Web.config 。

<system.webServer>
        <httpProtocol>
          <customHeaders>
          <remove name="Vary"></remove>
          <add name="Vary" value="Accept-Encoding"></add>
          </customHeaders>
        </httpProtocol>
      </system.webServer>

指定“Vary:Accept-Encoding”标头,网站需要启用GZip,才变得有意义。网站如何启用GZip?可以看看如下的教程:

IIS启用GZip压缩的详细教程【图解】

Nginx 如何配置GZip压缩

如何启用Apache的GZip压缩功能

lighttpd 如何配置GZip压缩

相关文章

IIS启用GZIP压缩css、js无效的原因及解决方法

IIS启用GZip失败之原因:临时目录权限没设好

图片GZip压缩后体积会变大

GZip压缩启动后js css不能运行的解决方法

转载于:https://www.cnblogs.com/niaowo/p/4000691.html

相关文章:

protobufjs 命令执行_【原码笔记】-- protobuf.js 与 Long.js

protobuf.js的结构和webpack的加载之后的结构很相似。这样的模块化组合是个不错的结构方式。1个是适应了不同的加载方式&#xff0c;2个模块直接很独立。webpack的功能更全一点。但如果自己封装js库这样够用了。而且模块对外统一接口 module.exports。这和node很像。(function(…

IBM X3550 RAID 扩容实例

背景&#xff1a;系统更新&#xff0c;原服务器容量不足&#xff0c;原服务器硬盘配置如下&#xff1a;2块146G 10K SAS 硬盘组成的RAID 1&#xff0c;咨询供应商&#xff0c;原来的硬盘已停产&#xff0c;现只有直接上两块新的盘增加一个RAID 1 实现扩容&#xff0c;增加两块3…

react取消监听scroll事件

如果要移除事件addEventListener的执行函数必须使用外部函数而不能直接使用匿名函数 错误写法&#xff1a; // 这样写是移除不了滚动事件的 componentDidMount() {// 添加滚动监听window.addEventListener(scroll, ()>{console.log("滚动距离&#xff1a;",window…

ceph存储 PG的状态机 源码分析

文章目录PG 的状态机和peering过程1. PG 状态机变化的时机2. pg的状态演化过程3. pg状态变化实例讲解3.1 pg状态的管理结构3.2 数据的pg状态变化过程3.2.1 NULL -> initial3.2.2 initial -> reset -> Started3.2.3 Started(start) ->Started( primary(Peering(GetI…

JDBC连接MySQL数据库及演示样例

JDBC是Sun公司制定的一个能够用Java语言连接数据库的技术。 一、JDBC基础知识 JDBC&#xff08;Java Data Base Connectivity,java数据库连接&#xff09;是一种用于执行SQL语句的Java API&#xff0c;能够为多种关系数据库提供统一訪问&#xff0c;它由一组用Java语言…

Linux从mysql中读取数据_linux shell中读写操作mysql数据库

本文介绍了如何在shell中读写mysql数据库。主要介绍了如何在shell 中连接mysql数据库&#xff0c;如何在shell中创建数据库&#xff0c;创建表&#xff0c;插入csv文件&#xff0c;读取mysql数据库&#xff0c;导出mysql数据库为xml或html文件&#xff0c; 并分析了核心语句。本…

算法系列之二十:计算中国农历(二)

&#xff08;接上篇&#xff09; 所谓的“天文算法”&#xff0c;就是利用经典力学定律推导行星运转轨道&#xff0c;对任意时刻的行星位置进行精确计算&#xff0c;从而获得某种天文现象发生时的时间&#xff0c;比如日月合朔这一天文现象就是太阳和月亮的地心黄经&#xff08…

如何限制只有某些IP才能使用Tomcat Manager

只有指定的主机或IP地址才可以访问部署在Tomcat下的应用。Tomcat提供了两个参数供你配置&#xff1a;RemoteHostValve 和RemoteAddrValve&#xff0c;前者用于限制主机名&#xff0c;后者用于限制IP地址。 通过配置这两个参数&#xff0c;可以让你过滤来自请求的主机或IP地址&a…

leetcode-24 两两交换链表中的节点

题目描述 给定一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后的链表。 你不能只是单纯的改变节点内部的值&#xff0c;而是需要实际的进行节点交换。 示例: 给定 1->2->3->4, 你应该返回 2->1->4->3. 方法一&#xff08;递归&#x…

TimeQuest学习之三------外部寄存器模型

clock skew < destination reg clock delay > - < source reg clock delay > 为了使clock skew 的影响可以叠加到data delay上&#xff0c;给出如下三组公式&#xff08;对于fpga2ic&#xff09;&#xff1a; 1.clock skew <ext_clk delay> - < fpga_cl…

linux mysql远程链接_Linux下mysql实现远程连接

首先明白一点并不是mysql禁止远程连接&#xff0c;而是MYSQL的账号禁止远程连接。可能觉得我有点咬文嚼字了&#xff0c;不过我感觉分清这点还是很重要的。默认情况下&#xff0c;所有账号都是禁止远程连接的。在安装MYSQL的时候&#xff0c;在设置ROOT密码那里有一个CHECKBOX&…

H5 客户端设置title 滑动验证码

转载于:https://www.cnblogs.com/Airoocle/p/10420140.html

leetcode-2 两数相加

给出两个 非空 的链表用来表示两个非负的整数。其中&#xff0c;它们各自的位数是按照 逆序 的方式存储的&#xff0c;并且它们的每个节点只能存储 一位 数字。 如果&#xff0c;我们将这两个数相加起来&#xff0c;则会返回一个新的链表来表示它们的和。 您可以假设除了数字 0…

spring-注解

spring框架提供xml文件的配置&#xff0c;也提供基于注解的方式实现配置任何的Bean实例&#xff0c;目前&#xff0c;struts2、hibernate和spring都相继支持基于注解的实现方式。spring要求程序员指定搜索哪些路径下的java类&#xff0c;spring会把合适的java类全部注册成sprin…

mysql raw_Oracle中的Raw类型解释

RAW&#xff0c;类似于CHAR&#xff0c;声明方式RAW(L)&#xff0c;L为长度&#xff0c;以字节为单位&#xff0c;作为数据库列最大2000&#xff0c;作为变量最大32767字节。 LONG RAW&#xff0c;类似于LORAW&#xff0c;类似于CHAR&#xff0c;声明方式RAW(L)&#xff0c;L为…

面试题6:用两个栈实现队列

思路&#xff1a;设置两个栈stack1和stack2&#xff0c;stack1实现入队列功能&#xff0c;stack2实现出队列功能。 &#xff08;1&#xff09;入队列&#xff1a;入栈stack1 &#xff08;2&#xff09;出队列&#xff1a;若stack2不空&#xff0c;则直接弹出stack2中的栈顶元素…

php从数据库读取中文显示问号??的解决办法

出错原因&#xff1a;1、数据库编码格式不对 2、PHP编码格式不对 3、浏览器编码格式不对 上面三者编码格式不统一&#xff0c;就会出现问题 数据库读取的时候在mysqli_connect()之后要设置连接字符编码mysqli_query($db, “set names ‘utf8”);这样才能保证在浏览器显示的结果…

leetcode-20 有效的括号匹配

给定一个只包括 ‘(’&#xff0c;’)’&#xff0c;’{’&#xff0c;’}’&#xff0c;’[’&#xff0c;’]’ 的字符串&#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。 注意空字符串可…

将ADS1.2的工程迁移到KEIL上-基于2440

新版的MDK支持2440相关芯片,但是很多人的工程都是基于ADS1.2开发,文字不好看,兼容性不好等等问题,而且电脑上装太多开发工具切换起来也麻烦,所以切换到MDK开发2440裸机程序应该是一个很好的选择 1. 新建MDK工程,芯片选择2440 不拷贝启动代码,因为我们用自己的启动代码 2.…

mysql占用资源最小的语句_MySQL一个语句查出各种整形占用字节数及最大最小值的实例...

直接上码&#xff1a;select bigint unsigned as type ,8 as bytes ,~0 as max_num,0 as min_num unionselect int unsigned,4,~0>>32,0 unionselect mediumint unsigned,3,~0>>40,0 unionselect smallint unsigned,2,~0>>48,0 unionselect tinyint unsigned…

使用命名管道的OVERLAPPED方式实现非阻塞模式编程 .

命令管道是进程间通讯的一种常用方式&#xff0c;对于命令管道的介绍可以参考别的资料和书籍&#xff0c;这里推荐一个《VC下命名管道编程的原理及实现》这篇博文&#xff0c;写得比较清楚。但是都是介绍了阻塞模式的编程&#xff0c;我这里主要是介绍利用命令管道OVERLAPPED方…

读梦断代码有感(1)2019.2.05

今天阅读了建民老师推荐的我们软件工程方面的书籍被称为经典的《梦断代码》&#xff0c;虽然只是读了一小部分但还是感受颇深&#xff0c;在我以往的经验看来&#xff0c;我们软件工程专业的书籍应该都是枯燥乏味的代码啊啥的&#xff0c;所以开始我并没有对这本书有多大的期望…

leetcode-25 K个一组反转链表

给你一个链表&#xff0c;每 k 个节点一组进行翻转&#xff0c;请你返回翻转后的链表。 k 是一个正整数&#xff0c;它的值小于或等于链表的长度。 如果节点总数不是 k 的整数倍&#xff0c;那么请将最后剩余的节点保持原有顺序。 示例 : 给定这个链表&#xff1a;1->2-…

自己动手写简单的web应用服务器(4)—利用socket实现文件的下载

直接上源码&#xff1a; 服务器&#xff1a; 1 package download;2 3 import java.io.BufferedInputStream;4 import java.io.BufferedOutputStream;5 import java.io.File;6 import java.io.FileInputStream;7 import java.io.IOException;8 import java.io.OutputStream;9 im…

mysql 数据泵_Oracle 数据泵详解

一、 EXPDP和IMPDP使用说明 Oracle Database 10g引入了最新的数据泵(Data Dump)技术&#xff0c;数据泵导出导入(EXPDP和IMPDP)的作用 1)实现逻辑备份和逻辑恢复. 2)在数据库用户之间移动对象. 3)在数据库之间移动对象 4)实现表空间搬移. 二、数据泵导出导入与传统一、EXPDP和I…

php 使用curl模拟登录discuz以及模拟发帖

<?php$discuz_url http://127.0.0.1/discuz/;//论坛地址$login_url $discuz_url .logging.php?actionlogin;//登录页地址 $post_fields array();//以下两项不需要修改$post_fields[loginfield] username;$post_fields[loginsubmit] true;//用户名和密码&#xff0c;必…

Java数组的初始化

1.动态初始化 数据类型 [] 变量名 new 数据类型 [数组大小]; //数组的动态初始化int [] arr new int [3]; 2.静态初始化 数据类型 [] 变量名 {元素1&#xff0c;元素2.....} //数组的静态初始化int [] arr2 {1,2,3}; 转载于:https://www.cnblogs.com/luguankun/p/1043128…

leetcode-135 分发糖果

题目描述&#xff1a; 老师想给孩子们分发糖果&#xff0c;有 N 个孩子站成了一条直线&#xff0c;老师会根据每个孩子的表现&#xff0c;预先给他们评分。 你需要按照以下要求&#xff0c;帮助老师给这些孩子分发糖果&#xff1a; 每个孩子至少分配到 1 个糖果。 相邻的孩子…

mysql主从数据库含义_(转)Mysql数据库主从心得整理

管理mysql主从有2年多了&#xff0c;管理过200多组mysql主从&#xff0c;几乎涉及到各个版本的主从&#xff0c;本博文属于总结性的&#xff0c;有一部分是摘自网络&#xff0c;大部分是根据自己管理的心得和经验所写&#xff0c;整理了一下&#xff0c;分享给各位同行&#xf…

Const 重载解析

1. Const重载应用场景 首先&#xff0c;对于函数值传递的情况&#xff0c;因为参数传递是通过复制实参创建一个临时变量传递进函数的&#xff0c;函数内只能改变临时变量&#xff0c;但无法改变实参。则这个时候无论加不加const对实参不会产生任何影响。但是在引用或指针传递函…