博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Nginx使用Expires增加浏览器缓存加速
阅读量:5134 次
发布时间:2019-06-13

本文共 2317 字,大约阅读时间需要 7 分钟。

Max-age是指我们的web中的文件被用户访问(请求)后的存活时间,是个相对的值,相对Request_time(请求时间)。

Expires它比max-age要麻烦点,Expires指定的时间分"相对文件的最后访问时间-Last-Modified"和"绝对修改时间-If-Modified-Since"。

Expires 表示存在时间,允许客户端在这个时间之前不去检查(发请求),等同max-age的效果。但是如果同时存在,则被Cache-Control的max-age覆盖。

 

location ~* \.(css|js)$ {

       expires 1m;       此时Response Headers中的 Cache-Control: max-age=60 (以为单位)

}

------------------------------------------------------------------------------------------------

expires 指令可以控制 HTTP 应答中的“ Expires ”和“ Cache-Control ”的头标(起到控制页面缓存的作用)

语法:expires [time|epoch|max|off]

默认值:off    -----不修改“Expires”和"Cache-Control"的值

作用域: http, server, location

expires指令控制HTTP应答中的“Expires”和“Cache-Control”Header头部信息,启动控制页面缓存的作用

time:可以使用正数或负数。“Expires”头标的值将通过当前系统时间加上设定time值来设定。

为epoch时, 指定“Expires”的值为 1  January, 1970, 00:00:01 GMT。

为max时, 指定“Expires”的值为 31  December 2037 23:59:59 GMT,“Cache-Control”的值为10年。

-1 指定“Expires”的值为 服务器当前时间 -1s,即永远过期

“Cache-Control”头标的值由您指定的时间来决定:

time值还控制"Cache-Control"的值:

负数表示no-cache
正数或零表示max-age=time

 

cache-control :

max-age > 0  时 直接从本地浏览器缓存中提取 
max-age <=0 时 每次向server发送http请求确认该资源是否有修改。有的话 返回200 ,无的话 返回304

 

expires使用了特定的时间,并且要求服务器和客户端的是中严格同步。

而Cache-Control是用max-age指令指定组件被缓存多久。
对于不支持http1.1的浏览器,还是需要expires来控制。所以最好能指定两个响应头。但HTTP规范规定max-age指令将重写expires头。

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

第一次访问时的请求Header,并且返回200

Etag:指示资源的状态唯一标识

第二次访问时的请示Header:

这时返回的状态码是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的页面是最新的,于是客户端就可以直接从本地加载页面了,这样在网络上传输的数据就会大大减少,同时也减轻了服务器的负担。

 

如果只是用浏览器打开,那么浏览器会去判断这个资源在缓存里有没有,如果有的话,会去判断max-age,看看过期没有,如果没有过期,则直接读缓存,根本不会和服务器进行交互,换句话说,断网都能打开,就和本地跑一样!如果已经过期了,那就去服务器请求,等待服务器响应,这是很费时间的,服务器如果发现资源没有改变过,那么就会返回304,告诉浏览器,我没变过,你去读缓存吧,于是浏览器也不用从服务器拉数据了。

 

经测试如果缓存未过期的情况下,在已打开的页面进行任何刷新操作的话,此时仍会往服务器发送GET请求。只有在新打开的页面,才会读取本地缓存内容。

 

 

 

如果不想让代理或浏览器缓存,加no-cache参数或private参数

# expires 1d;
add_header Cache-Control no-cache;
add_header Cache-Control private;
这样浏览器F5刷新时,每次返回的依然是200,而不是304.

 

转载于:https://www.cnblogs.com/wjoyxt/p/6187736.html

你可能感兴趣的文章
IDEA启动时自动报Plugin Error错误
查看>>
Oracle初级第一天
查看>>
Python网络爬虫与信息提取-Beautiful Soup 库入门
查看>>
一、SQL语法——13-集合运算
查看>>
十三、控制文件下载
查看>>
call指令和ret指令的配合使用
查看>>
flag寄存器
查看>>
Qt_OpenGL_教程
查看>>
Kafka spring 集成
查看>>
前端的各种各样的面试题大全
查看>>
【测试管理_浅谈软件测试的价值及如何做】
查看>>
Prism翻译笔记(一)第一章:介绍
查看>>
Oracle同义词创建及其作用
查看>>
技术名称(随学随更新)
查看>>
在make php-5.5.5时提示没有X11/xpm.h,怎么解决!
查看>>
如何让你的数据有null
查看>>
前端设计(一)
查看>>
大道至简第六章读后感
查看>>
@RabbitListener 与 @RabbitHandler 及 消息序列化
查看>>
Visual Studio 2013 Update 3 RTM 正式发布
查看>>