expires指令控制HTTP应答中的“Expires”和“Cache-Control”Header头部信息,启动控制页面缓存的作用
time:可以使用正数或负数。“Expires”头标的值将通过当前系统时间加上设定time值来设定。
time值还控制"Cache-Control"的值:
负数表示no-cache
正数或零表示max-age=time
 
epoch:指定“Expires”的值为 1 January,1970,00:00:01 GMT
max:指定“Expires”的值为31 December2037 23:59:59GMT,"Cache-Control"的值为10年。
-1:指定“Expires”的值为当前服务器时间-1s,即永远过期。
off:不修改“Expires”和"Cache-Control"的值

expires使用了特定的时间,并且要求服务器和客户端的是中严格同步。
而Cache-Control是用max-age指令指定组件被缓存多久。
对于不支持http1.1的浏览器,还是需要expires来控制。所以最好能指定两个响应头。但HTTP规范规定max-age指令将重写expires头。

一般用于页面变化不是很快的时候,如果缓存过期了,浏览器在重用它之前会首先确认他是否有效,就是一个“条件GET请求”,如果有效,返回304状态码。
expires通过Last-Modified响应头来确定。如图:
第一次访问:
请求:

返回:

第二次访问:
请求:

返回:

这时返回的状态码是304,而在请求中比第一次多了If-Modified-Since头,和原始服务器中的Last-Modified制作比较,所以实现浏览器缓存并判断是否过期。
简单的说,Last-Modified 与If-Modified-Since 都是用于记录页面最后修改时间的 HTTP 头信息,只是 Last-Modified 是由服务器往客户端发送的 HTTP 头,而 If-Modified-Since 则是由客户端往服务器发送的头,可以看到,再次请求本地存在的 cache 页面时,客户端会通过 If-Modified-Since 头将先前服务器端发过来的 Last-Modified 最后修改时间戳发送回去,这是为了让服务器端进行验证,通过这个时间戳判断客户端的页面是否是最新的,如果不是最新的,则返回新的内容,如果是最新的,则返回304告诉客户端其本地 cache 的页面是最新的,于是客户端就可以直接从本地加载页面了,这样在网络上传输的数据就会大大减少,同时也减轻了服务器的负担。

如果不想让代理或浏览器缓存,加no-cache参数或private参数:
# expires 1d;
add_header Cache-Control no-cache;
add_header Cache-Control private;

etag:
实体标签,是用来确认web服务器和浏览器缓存有效性的一种机制。
原始服务器使用ETag响应头来指定组件的ETag
浏览器通过If-None-Match头将ETag传回原始服务器。如果匹配,返回304
如图:
第一次访问:
请求:

返回:

第二次请求:

返回:

依然返回的状态码是304,而在请求中比第一次多了If-None-Match头。所以实现浏览器缓存。如果这个值对不上,则缓存过期。
ETags和If-None-Match是一种常用的判断资源是否改变的方法。类似于Last-Modified和HTTP-If-Modified-Since。但是有所不同的是Last-Modified和HTTP-If-Modified-Since只判断资源的最后修改时间,而ETags和If-None-Match可以是资源任何的任何属性。
ETags和If-None-Match的工作原理是在HTTP Response中添加ETags信息。当客户端再次请求该资源时,将在HTTP Request中加入If-None-Match信息(ETags的值)。如果服务器验证资源的ETags没有改变(该资源没有改变),将返回一个304状态;否则,服务器将返回200状态,并返回该资源和新的ETags。

IIS上的ETag格式需要修改。

是选择ETags还是
Etag主要为了解决Last-Modified无法解决的一些问题.他能比Last_Modified更加精确的知道文件是否被修改过.如果有个文件修改非常频繁,比如在秒以下的时间内进行修改,比如1秒内修改了10次,If-Modified-Since能检查只能秒级的修改,所以这种修改无法判断. 原因是UNIX记录MTIME只能精确到秒。

在大型多WEB集群时,使用ETag时有问题,所以有人建议使用WEB集群时不要使用ETag,其实很好解决,因为多服务器时,INode不一样,所以不同的服务器生成的ETag不一样,所以用户有可能重复下载(这时ETag就会不准)


如果服务器端同时设置了Etag和Expires 时,Etag原理同样,即与Last-Modified/Etag对应的HttpRequest Header:If-Modified-Since和If-None-Match。我们可以看到这两个Header的值和WebServer发出的 Last-Modified,Etag值完全一样;在完全匹配If-Modified-Since和If-None-Match即检查完修改时间和 Etag之后,服务器才能返回304.
如果服务器又设置了Cache-Control:max-age和Expires呢,怎么办?
答案是同时使用,也就是说在完全匹配If-Modified-Since和If-None-Match即检查完修改时间和Etag之后,服务器才能返回304.(不要陷入到底使用谁的问题怪圈)

expires与etag控制页面缓存的优先级相关推荐

  1. Nginx设置expires设定页面缓存时间

    2019独角兽企业重金招聘Python工程师标准>>> 配置expires expires起到控制页面缓存的作用,合理的配置expires可以减少很多服务器的请求 要配置expire ...

  2. vue切换路由页面数据缓存_Vue-Router实现前端页面缓存

    一.使用情景 在使用Vue开发单页面应用时,我们通常会使用Vue-Router进行页面导航,Vue-Router在进行路由切换的时候,页面是会重新加载,对应的生命周期函数也会再次执行一遍,但是在有些业 ...

  3. 使用服务器端控制AJAX页面缓存

    你知道 response.setHeader("Cache-Control","no-cache"); 这条语句是干什么的吗? 这是用来防止浏览器缓存动态内容生 ...

  4. Thinkphp 3.2中控制页面不缓存

    最近开发WAP网站时,最讨厌的就是back键,会造成些麻烦事.不过,问题总有办法解决. 有些页面,点击back键回退会加载缓存,这不是想要的,所以希望能够控制该页面不缓存,每次请求都需要从服务器获取最 ...

  5. memc_nginx+srcache_nginx+memcached构建透明的动态页面缓存

    为什么80%的码农都做不了架构师?>>>    在上一节< nginx+memcached构建页面缓存应用> http://www.ttlsa.com/html/2418 ...

  6. Html静态页面缓存问题,解决缓存更新不及时需清空缓存更新页面

    问题 在写静态网站的时候,经常回面临某些页面上传更新后,查看时会出现没有更新的清空,就是因为浏览器读取了缓存造成的,需要清空缓存刷新才可以看到页面的更新,但是有些用户不知道这些操作.就很头痛 浏览器缓 ...

  7. Etag与HTTP缓存机制

    Etag - Last-Modified和Etags如何帮助提高性能? 把Last-Modified和ETags请求的http报头一起使用,这样可利用客户端(例如浏览器)的缓存.因为服务器首先产生La ...

  8. vue 删除页面缓存_vue项目强制清除页面缓存的例子

    异常描述: 支付宝中内嵌h5项目(vue框架开发),前端重新打包上传之后访问页面会导致页面空白.页面tab点击异常之类异常情况,需要手动清除支付宝缓存才可以正常访问. 解决方案: 在HTTP协议中,只 ...

  9. Nginx 反向代理、负载均衡、页面缓存、URL重写及读写分离详解(1)

    大纲 一.前言 二.环境准备 三.安装与配置Nginx 四.Nginx之反向代理 五.Nginx之负载均衡 六.Nginx之页面缓存 七.Nginx之URL重写 八.Nginx之读写分离 注,操作系统 ...

最新文章

  1. 基于证书的WCF安全开发详解
  2. HOG + SVM 实现图片分类(python3)
  3. centos7 安装MyCli MySQL 客户端
  4. 关于meta http-equiv=Content-Type content=text/html:charset=UTF-8
  5. 8.8 Sencha Studio 监视工具( Inspect Tool)
  6. flex bison解析json文件_每秒解析千兆字节的 JSON 解析器开源了
  7. OpenGL基础28:模型
  8. 描述:给出若干个数,将数字存储在数组中,然后使用插入排序,按照升序排列出输出数字。输入一个整数n表示有n个数,接着输入这n个数。按照升序输出这n个数。输入输出示例:输入:53 2
  9. 计算机360u盘删除,怎么关闭360U盘小助手
  10. 下载DirectX 9 SDK开发包
  11. 基于关系图卷积网络的源代码漏洞检测
  12. 电路图精简版(web内置画图软件)
  13. labwindows 多线程
  14. python展示水果价格_小姨开水果店的,所以今天用Python写了一个水果店小系统!...
  15. 数据铁笼-郑州Android项目ViewPager刷新问题
  16. 你有哪些独到的识人技巧?
  17. Cotex-M3内核STM32F10XX系列时钟及其配置方法
  18. 火车站售票系统课程设计
  19. 儿童高脚椅、餐椅安全标准ASTM F404
  20. 离散数学5:二元关系

热门文章

  1. 日常刷python总结
  2. python数据去噪声_Logreduce:用Python和机器学习去除日志噪音
  3. 对象特性-构造函数和析构函数
  4. 数据结构和算法:(3)3.2.2单链表的整表删除
  5. python动态类型是如何实现的_Python 的动态类型系统
  6. py-redis中的批量删除key方法
  7. 玻璃和水晶PBR纹理材质预设
  8. LTE - PUCCH Format2
  9. 轻量级git服务器 Gogs git 服务器搭建
  10. 【Android】基于A星寻路算法的简单迷宫应用