这样,Client 端等于 Cache 了两份,服务器端就会比对2者的 etag 。如果 If-None-Match 为False,不返回 200,返回 304(Not Modified) Response 。
3、Expires
给出的日期/时间后,被响应认为是过时 。如 Expires:Thu, 02 Apr 2009 05:14:08 GMT 需和Last-Modified 结合使用 。用于控制请求文件的有效时间,当请求数据在有效期内时客户端浏览器从缓存请求数据而不是服务器端.当缓存中数据失效或过期,才决定从服务器更新数据 。
4、Last-Modified和Expires
Last-Modified 标识能够节省一点带宽,但是还是逃不掉发一个 HTTP 请求出去,而且要和Expires一起用 。而 Expires 标识却使得浏览器干脆连 HTTP 请求都不用发,比如当用户 F5 或者点击 Refresh 按钮的时候就算对于有 Expires 的 URI,一样也会发一个 HTTP 请求出去,所以,Last-Modified 还是要用的,而且要和 Expires 一起用 。
5、Etag和Expires
如果服务器端同时设置了 Etag 和 Expires 时,Etag 原理同样,即与 Last-Modified/Etag 对应的 HttpRequestHeader:If-Modified-Since 和 If-None-Match 。我们可以看到这两个 Header 的值和 WebServer 发出的 Last-Modified,Etag 值完全一样;在完全匹配If-Modified-Since 和 If-None-Match 即检查完修改时间和 Etag 之后,服务器才能返回304.
6、Last-Modified和Etag
分布式系统里多台机器间文件的 last-modified 必须保持一致,以免负载均衡到不同机器导致比对失败. 分布式系统尽量关闭掉 Etag(每台机器生成的 etag 都会不一样)
Last-Modified 和 ETags 请求的http报头一起使用,服务器首先产生 Last-Modified/Etag 标记,服务器可在稍后使用它来判断页面是否已经被修改,来决定文件是否继续缓存
过程如下:
1) 客户端请求一个页面(A) 。
2) 服务器返回页面 A,并在给A加上一个 Last-Modified/ETag 。
3) 客户端展现该页面,并将页面连同 Last-Modified/ETag 一起缓存 。
4) 客户再次请求页面 A,并将上次请求时服务器返回的 Last-Modified/ETag 一起传递给服务器 。
5) 服务器检查该 Last-Modified 或 ETag,并判断出该页面自上次客户端请求之后还未被修改,直接返回响应 304 和一个空的响应体 。
需要注意:
1) Last-Modified 和 Etag 头都是由 WebServer 发出的 HttpReponse Header,WebServer 应该同时支持这两种头 。
2) WebServer 发送完 Last-Modified/Etag 头给客户端后,客户端会缓存这些头;
3) 客户端再次发起相同页面的请求时,将分别发送与 Last-Modified/Etag 对应的HttpRequestHeader:If-Modified-Since和If-None-Match 。我们可以看到这两个 Header 的值和 WebServer 发出的 Last-Modified,Etag 值完全一样;
4) 通过上述值到服务器端检查,判断文件是否继续缓存;
7、关于 Cache-Control: max-age=秒 和 Expires
Expires = 时间,HTTP 1.0 版本,缓存的载止时间,允许客户端在这个时间之前不去检查(发请求)
max-age = 秒,HTTP 1.1 版本,资源在本地缓存多少秒 。
如果 max-age 和 Expires 同时存在,则被 Cache-Control 的 max-age 覆盖 。
Expires 的一个缺点: 就是返回的到期时间是服务器端的时间,这样存在一个问题,如果客户端的时间与服务器的时间相差很大,那么误差就很大,所以在HTTP 1.1版开始,使用Cache-Control: max-age=秒替代 。
Expires =max-age + “每次下载时的当前的request时间”
所以一旦重新下载的页面后,expires就重新计算一次,但last-modified不会变化.
8、基于nginx 配置使用总结
分布式系统(有 ng-ha 和 应用的负载均衡),最好使用 Last-Modified 和 Expires,把 Etag 关闭掉 。
1) 关闭 etag
http {
etag off;
关闭 etag, 使用 Last-Modified 和 Expires
2) 配置 last-modified (默认开启)和expires
location ~.*.(gif|jpg|jpeg|png|bmp|swf)$ { expires 30d; } location ~.*.(js|css)?$ { expires 12h; }对于配置了多个 location(upstream) 的,可以:
location /filebase/ { root /hskj/file/; autoindex on;if ($request_filename ~* ^.*?.(txt|doc|pdf|rar|gz|zip|docx|exe|xlsx|ppt|pptx)$){ add_header Content-Disposition: 'attachment;'; }if ($request_filename ~* ^.*?.(gif|jpg|jpeg|png|bmp|swf)$){ expires 30d; }if ($request_filename ~* ^.*?.(js|css)$){ expires 12h; }}效果如下:

文章插图
这里顺便看一个配置实例: nginx 设置不使用缓存 add_header Cache-Control no-cache
server { listen 443; server_name www.kevin.com; charset utf-8;ssl on; ssl_certificate /daka/program/nginx/conf/server.cer; ssl_certificate_key /daka/program/nginx/conf/server.key; ssl_session_timeout 5m; ssl_protocols SSLv2 SSLv3 TLSv1; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on;#设置浏览器缓存 add_header Cache-Control no-cache; add_header Cache-Control private;location /yp { proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://192.168.0.221:8082/yp/yp;if ($request_filename ~* .*.(html|htm)$) { expires -1s; }if ($request_filename ~* .*.(gif|jpg|jpeg|png|bmp|swf)$) { expires 30d; }if ($request_filename ~ .*.(js|css)$) { expires 12h; } }location /static { proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://192.168.0.221:8082/static;if ($request_filename ~* .*.(html|htm)$) { expires -1s; }if ($request_filename ~* .*.(gif|jpg|jpeg|png|bmp|swf)$) { expires 30d; }if ($request_filename ~ .*.(js|css)$) { expires 12h; }}location / { proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://192.168.0.221:8080/;# if (-e $request_filename){# rewrite ^/$ https://www.kevin.com:443/invest/index.jhtml permanent;# }if ($request_filename ~* .*.(html|htm)$) {# expires -1s; }if ($request_filename ~* .*.(gif|jpg|jpeg|png|bmp|swf)$) { expires 30d; }if ($request_filename ~ .*.(js|css)$) { expires 12h; }}}
推荐阅读
- 尚客茶业吹响中秋下价集结号
- 从间谍木马到远控木马,这群黑客下手越来越狠
- 网络营销:关于外链你了解多少?
- 神经衰弱吃什么药 让你的神经松弛下来
- 5个家常菜让钙片“下岗”
- 关于今年普洱茶价格的思考
- 每天一杯茶 再也不怕电脑辐射
- 刘备对儿子留下的遗言 刘备临终前遗言
- 梦见骑自行车下坡很快掉到悬崖下面了 梦见骑自行车下坡很快是什么意思
- 梦见奶奶第二次去世头掉下来了 梦见奶奶第二次去世,我哭到不行
