浏览器缓存问题处理

最近在项目发布的过程中,我经常会遇到这种情况。发布的静态文件(包括图片、js文件、css文件等等)在浏览器中未生效。针对此种情况,我在网上找了很多资料,终于让我有所了解。

在说解决方案之前,我们要先了解一下http请求文件的过程。通常情况下,经过三次握手建立TCP连接之后,客户端就开始发送http请求,服务器接收到请求后,会根据自身的设置来判断是否将最新的文件返回给客户端。根据以上的请求过程,我们来分析一下,为什么浏览器会有缓存。有两种可能:客户端没有向服务器发送文件请求;服务器接收到请求后,没有向客户端返回最新文件。

一、针对第一种可能性,主要涉及到的是http请求及响应中头部的Cache-Control和Expired字段。

1、Cache-Control字段

请求头中Cache-Control的取值为no-cache、no-store、max-age、 max-stale、min-fresh、only-if-cached。

响应头中Cache-Control的取值为public、private、no-cache、no- store、no-transform、must-revalidate、proxy-revalidate、max-age。

下面是常用的Cache-Control组合:

no-cache: 数据内容不能被缓存, 每次请求都重新访问服务器, 若有max-age, 则缓存期间不访问服务器。
no-store: 不仅不能缓存, 连暂存也不可以(即: 临时文件夹中不能暂存该资源)。
private(默认): 只能在浏览器中缓存, 只有在第一次请求的时候才访问服务器, 若有max-age, 则缓存期间不访问服务器。
public: 可以被任何缓存区缓存, 如: 浏览器、服务器、代理服务器等。
max-age: 相对过期时间, 即以秒为单位的缓存时间。
no-cache, private: 打开新窗口时候重新访问服务器, 若设置max-age, 则缓存期间不访问服务器。
-  private, 正数的max-age: 后退时候不会访问服务器。
-  no-cache, 正数的max-age: 后退时会访问服务器。

2、Expired字段

设置绝对过期时间,在此时间之前,均使用浏览器缓存。但是相比于Cache-Control,优先级较低,所以若同时设置了Cache-Control和Expired字段,以Cache-Control为准。

二、针对第二种可能性,主要涉及的是http请求头中的If-Modified-Since字段

当http向服务器请求文件时,服务器会根据自身设置,决定是否比较请求头中的If-Modified-Since字段和服务器本地文件的修改时间,从而决定是否返回最新文件。

三、解决办法

1、设置版本号

这是常用的解决办法。在引用静态文件的代码中,在静态文件的url路径后添加版本号变量,此变量一般为随机数或与当前日期相关的时间戳,不做特殊要求,只要唯一即可。如https://baidu.com/test/test.js改为https://baidu.com/test/test.js?ver=随机数。这样做的目的,是让浏览器和服务器认为,此文件为新引入的文件路径,从而获取到最新的文件。

此方法适用于新建项目。因为老的项目代码框架已固定,若要对所有静态文件设置统一的版本号,代码改动量太大。

2、设置页面的请求缓存机制

针对某些需要实时获取的文件,我们可以在相应的请求头中设置Cache-Control和Expired字段

3、设置服务器的缓存响应机制

(1)iis服务器

通过对静态文件所在文件夹设置web内容过期时间。具体操作如下:

第一步,在iis管理器上找到对应的文件夹并点击,然后双击右侧的HTTP响应标头。

第二步,点击“设置常用标头”,勾选“使web内容过期”,并选择相应的过期时间。

设置完成后,浏览器就会在相应的时间之后获取最新的静态文件。

(2)nginx服务器

通过对http_core_module模块的if_modified_since配置项进行配置。if_modified_since取值为:off、exact、before。默认为exact。

off表示忽略http请求头中的if_modified_since字段,返回客户端最新的文件。

exact表示服务器会将请求头中的if_modified_since字段与服务器本地文件的最近修改时间进行比较,若不一致则返回最新文件;否则返回304 Not Modified响应。

before表示只要文件的上次修改时间等于或早于请求头中的if_modified_since字段,都会返回304 Not Modified响应。

 

 

 

最后,给大家两个建议。

(1)因为针对缓存的处理是由浏览器和服务器共同决定的,所以不仅要确定浏览器的缓存设置,也要确定服务器的缓存设置。因此,有时候需要两者配合使用。

(2)浏览器和服务器的这些配置项,均是用于避免http请求过于频繁,从而提高页面的加载速度,降低服务器的访问压力。所以,针对这些配置项,应谨慎设置。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值