expires与etag控制页面缓存的优先级
expires使用了特定的时间,并且要求服务器和客户端的是中严格同步。
而Cache-Control是用max-age指令指定组件被缓存多久。
对于不支持http1.1的浏览器,还是需要expires来控制。所以最好能指定两个响应头。但HTTP规范规定max-age指令将重写expires头。
第一次访问:
请求:
返回:
第二次访问:
请求:
返回:
这时返回的状态码是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;
如图:
第一次访问:
请求:
返回:
第二次请求:
返回:
依然返回的状态码是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格式需要修改。
在大型多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.
答案是同时使用,也就是说在完全匹配If-Modified-Since和If-None-Match即检查完修改时间和Etag之后,服务器才能返回304.(不要陷入到底使用谁的问题怪圈)
expires与etag控制页面缓存的优先级相关推荐
- Nginx设置expires设定页面缓存时间
2019独角兽企业重金招聘Python工程师标准>>> 配置expires expires起到控制页面缓存的作用,合理的配置expires可以减少很多服务器的请求 要配置expire ...
- vue切换路由页面数据缓存_Vue-Router实现前端页面缓存
一.使用情景 在使用Vue开发单页面应用时,我们通常会使用Vue-Router进行页面导航,Vue-Router在进行路由切换的时候,页面是会重新加载,对应的生命周期函数也会再次执行一遍,但是在有些业 ...
- 使用服务器端控制AJAX页面缓存
你知道 response.setHeader("Cache-Control","no-cache"); 这条语句是干什么的吗? 这是用来防止浏览器缓存动态内容生 ...
- Thinkphp 3.2中控制页面不缓存
最近开发WAP网站时,最讨厌的就是back键,会造成些麻烦事.不过,问题总有办法解决. 有些页面,点击back键回退会加载缓存,这不是想要的,所以希望能够控制该页面不缓存,每次请求都需要从服务器获取最 ...
- memc_nginx+srcache_nginx+memcached构建透明的动态页面缓存
为什么80%的码农都做不了架构师?>>> 在上一节< nginx+memcached构建页面缓存应用> http://www.ttlsa.com/html/2418 ...
- Html静态页面缓存问题,解决缓存更新不及时需清空缓存更新页面
问题 在写静态网站的时候,经常回面临某些页面上传更新后,查看时会出现没有更新的清空,就是因为浏览器读取了缓存造成的,需要清空缓存刷新才可以看到页面的更新,但是有些用户不知道这些操作.就很头痛 浏览器缓 ...
- Etag与HTTP缓存机制
Etag - Last-Modified和Etags如何帮助提高性能? 把Last-Modified和ETags请求的http报头一起使用,这样可利用客户端(例如浏览器)的缓存.因为服务器首先产生La ...
- vue 删除页面缓存_vue项目强制清除页面缓存的例子
异常描述: 支付宝中内嵌h5项目(vue框架开发),前端重新打包上传之后访问页面会导致页面空白.页面tab点击异常之类异常情况,需要手动清除支付宝缓存才可以正常访问. 解决方案: 在HTTP协议中,只 ...
- Nginx 反向代理、负载均衡、页面缓存、URL重写及读写分离详解(1)
大纲 一.前言 二.环境准备 三.安装与配置Nginx 四.Nginx之反向代理 五.Nginx之负载均衡 六.Nginx之页面缓存 七.Nginx之URL重写 八.Nginx之读写分离 注,操作系统 ...
最新文章
- 基于证书的WCF安全开发详解
- HOG + SVM 实现图片分类(python3)
- centos7 安装MyCli MySQL 客户端
- 关于meta http-equiv=Content-Type content=text/html:charset=UTF-8
- 8.8 Sencha Studio 监视工具( Inspect Tool)
- flex bison解析json文件_每秒解析千兆字节的 JSON 解析器开源了
- OpenGL基础28:模型
- 描述:给出若干个数,将数字存储在数组中,然后使用插入排序,按照升序排列出输出数字。输入一个整数n表示有n个数,接着输入这n个数。按照升序输出这n个数。输入输出示例:输入:53 2
- 计算机360u盘删除,怎么关闭360U盘小助手
- 下载DirectX 9 SDK开发包
- 基于关系图卷积网络的源代码漏洞检测
- 电路图精简版(web内置画图软件)
- labwindows 多线程
- python展示水果价格_小姨开水果店的,所以今天用Python写了一个水果店小系统!...
- 数据铁笼-郑州Android项目ViewPager刷新问题
- 你有哪些独到的识人技巧?
- Cotex-M3内核STM32F10XX系列时钟及其配置方法
- 火车站售票系统课程设计
- 儿童高脚椅、餐椅安全标准ASTM F404
- 离散数学5:二元关系