http缓存相关头

这里说的一下我对http控制客户端缓存的头的理解。

在请求一个静态文件的时候(图片,css,js)等,这些文件的特点是文件不经常变化,将这些不经常变化的文件存储起来,对客户端来说是一个优化用户浏览体验的方法。这就是客户端缓存的意义了。

客户端缓存文件存放在临时文件夹中,但是这里有个问题就是这个缓存文件存放多久呢?这个是有服务器端进行设置的。

Expires/Cache-Control

http头中的Expires/Cache-Control就是完成这个事情的。

当客户端第一次访问资源的时候,服务端再返回资源内容的同时也返回了Expires:2016-11-17T10:50:55.120Z.

服务器告诉浏览器:你Y的先把这个文件给我缓存起来,在这个日期之前,这个文件都不会变化了,你下次需要这个文件的时候,你就不要来找我要了,你就去缓存中拿就好了,又快又好。

浏览器:诺。

但是,浏览器毕竟在客户端,客户端的时间可能会不准确,用户可以随着自己的心情修改自己的机器时间,比如我把时间调成了2019-11-17T10:50:55.120Z.,那么怎么办呢?于是服务器怒了:我给你个绝对时间,你乱改,那我就给你个相对时间吧,于是返回了Cache-Control:max-age:600,浏览器你给我缓存十分钟去,于是浏览器就乖乖缓存十分钟去了。

但是问题又来了,如果服务器同时设置了Expires和Cache-Control怎么办呢?(不是闲着没事干,而是由于Cache-Control是http1.1中才有的)那么就是根据更先进的设置Cache-Control为标准。

好了,现在有个问题,我有个文件可能时不时会更新,服务器非常希望客户端时不时过来问一下这个文件是否过期,如果没过期,服务端只会告诉浏览器你的缓存还没有过期(304),服务端不会反悔数据。然后浏览器使用自己存储的缓存来做显示。这个就叫做条件请求。

Last-Modified/If-Modifiy-since

客户端第一次访问资源的时候,服务端反悔资源内容的同事返回了Last-Modifed:Wed, 07 Aug 2016 15:32:18 GMT服务端在告诉客户端你获取的这个文件我最后修改的时间,浏览器获取这个文件存到缓存中时,给缓存中的文件同时记录上这个最后修改时间。

第二次访问的时候(我们假设这里没有设置expires或者cache-control)那么服务端范文资源的时候会带上If-Modify-since:Wed, 07 Aug 2016 15:32:18 GMT ;

客户端询问服务端:喂,我需要的这个资源其实我这边已经有缓存了,我的缓存文件的最后修改时间是不是这个,如果你那边没有修改的话告诉我一下就好,不用返回实际的资源内容。繁殖,要是你有修改的话,你就把文件内容返回给我吧。

服务端回应说:如果没有修改返回304给客户端。如果有变化呢,就返回200,并且带上资源内容。

这个条件请求还有另一种方法:打标签(Tag).

ETag/If-None-Match

第一次访问资源的时候,服务端返回资源内容的同时返回了ETag:1234,告诉客户端:这个文件的标签是1234,我如果修改了我这边的资源的话,这个标签就会不一样了。

第二次客户端访问资源的时候,由于缓存中已经有Etag为1234的资源,客户端要去服务端查询的是这个资源有木有过期呢?所以带上了If-None-Match:1234。告诉服务端:如果你那边资源还是1234标签的资源,你就返回304。如果不是的话,你在返回资源内容好了。服务端比较下ETag来看是返回304还是200.

各种刷新

理解了上面的缓存标签之后就很好理解各种刷新了。

刷新有三种

浏览器中写地址,回车

F5

Ctrl+F5

假设对一个资源:

浏览器第一次访问,获取资源内容和cache-control: max-age:600,Last_Modify: Wed, 10 Aug 2013 15:32:18 GMT

于是浏览器把资源文件放到缓存中,并且决定下次使用的时候直接去缓存中取了。

浏览器url回车

浏览器发现缓存中有这个文件了,好了,就不发送任何请求了,直接去缓存中获取展现。(最快)

下面我按下了F5刷新

F5就是告诉浏览器,别偷懒,好歹去服务器看看这个文件是否有过期了。于是浏览器就胆胆襟襟的发送一个请求带上If-Modify-since:Wed, 10 Aug 2013 15:32:18 GMT

然后服务器发现:诶,这个文件我在这个时间后还没修改过,不需要给你任何信息了,返回304就行了。于是浏览器获取到304后就去缓存中欢欢喜喜获取资源了。

但是呢,下面我们按下了Ctrl+F5

这个可是要命了,告诉浏览器,你先把你缓存中的这个文件给我删了,然后再去服务器请求个完整的资源文件下来。于是客户端就完成了强行更新的操作...

还有说一下,那个ETag实际上很少人使用,因为它的计算是使用算法来得出的,而算法会占用服务端计算的资源,所有服务端的资源都是宝贵的,所以就很少使用etag了。

时间: 2024-10-13 08:45:33

http缓存相关头的相关文章

core_cm4相关头文件简要说明

core_cm4.h:内核功能的定义,比如NVIC相关寄存器的结构体和Systick配置: core_cm4_simd.h:包含与编译器相关的处理: core_cmFunc.h:内核核心功能接口头文件: core_cmInstr.h:包含一些内核核心专用指令. core_cm4相关头文件简要说明

dll开发相关头文件约定

#define __EXPORTS 1 #ifdef __cplusplus #ifdef __EXPORTS #define DLL_EXPORT extern "C" __declspec (dllexport) #else #define DLL_EXPORT extern "C" __declspec (dllimport) #endif #else #ifdef __EXPORTS #define DLL_EXPORT __declspec (dllexp

ios系统框架中的相关头文件(包含私有)

https://github.com/haidragon/iOS10.2-iphoneheadershttps://github.com/ichitaso?tab=repositories 原文地址:https://blog.51cto.com/haidragon/2403592

大话PHP缓存头

304的请求机制和200有什么不一样呢?在fiddler中查看304请求的时候突然想到这个问题,就想到研究下这个304请求机制了. 我们自己在nginx上放一个文件,test.png.可以使用下面的地址进行访问: http://test.yejianfeng.com/test.png   nginx配置文件如下: 这个的etag关闭是由于nginx默认是开启etag的,说明见ngx_http_core_module(http://nginx.org/en/docs/http/ngx_http_c

java攻城师之路--复习java web之request_respone

Servlet技术 两条主线1.HTTP协议 2.Servlet生命周期 init() 方法中参数 ServletConfig 对象使用通过ServletConfig 获得 ServletContext对象 使用 service方法 含有两个参数对象 ServletRequest ServletResponse 在实际开发Servlet过程中 不需要覆盖service ---- HttpServlet 根据请求方式自动调用doGet 或者 doPost doGet和doPost参数 HttpSe

response和request详解

JavaEE:response响应和request请求 Web服务器接收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象.和代表响应的response对象. request和response对象既然代表请求和响应,那么我们要获取客户机提交过来的数据,只需要找request对象,就行了.要向客户机输出数据,只需要找response对象就行了. HttpServletRequest封装客户端相关信息,服务器Servlet程序可以通过request对象操作客户端信

nginx实战(四)反向代理配置缓存及负载均衡

前言 反向代理,是指用户通过同一服务器访问服务器后端各被代理服务器的访问方式.(详见百度百科 https://baike.baidu.com/item/反向代理/7793488 )? nginx 反向代理的应用场景 1.实现外网用户对内网服务器的访问,相对保护内网服务器安全及节约网络资源2.增加缓存,缓解对内网服务器访问的压力3.通过负载均衡提高业务处理能力及高可用性? 访问内网配置 ### 代理参数,设置头信息 cat>conf/conf.d/proxy.conf<<EOF proxy

顶点缓存与索引缓存

顶点缓存与索引缓存是相互配合来简化重复顶点的,3D中任何显示出来的东西都是三角形,所以一个图元中含有n个三角形,但是计算机不认三角形,而只储存顶点,这就是顶点缓存,但是光有这些顶点是没法组织成一系列有序三角形的,所以要有索引缓存来和这部分顶点缓存相配合. 比如共有n个顶点,这些顶点中有些用了一次有些用了很多次,这n个顶点都存储在顶点缓存中. 然后索引缓存中只是一些0~n-1的数字对应顶点缓存中的n个顶点,然后计算机从索引缓存中开始3个一组的读取三角形,直到此图元绘制完成. 函数实现:g_pd3d

java Servlet中通过response头信息设置浏览器禁止缓存

主要是通过禁用浏览器相关头信息,只需要在servlet的doget或dopost方法中加入如下语句即可 response.setHeader("Cache-Control", "no-cache"); response.setHeader("Pragma", "no-cache"); response.setDateHeader("expires", -1);