IE浏览器仅在Ajax get请求的缓存问题的几种解决方案

本文探讨了IE浏览器在GET请求时缓存动态文件的现象,详细介绍了四种解决方案:1) 添加随机数;2) 设置时间戳;3) 修改请求头;4) PHP设置响应头禁止缓存。每种方法的优缺点也被阐述,旨在确保每次请求都能获取服务器最新内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、IE浏览器仅在get请求的缓存问题

1.1、缓存介绍

浏览器的第一次请求需要从服务器获得许多 css、img、js 等相关的文件,如果每次请求都把相关的资源文件加载一次,对 带宽、服务器资源、用户等待时间 都有严重的损耗,浏览器有做优化处理,其把css、img、js等文件在第一次请求成功后就在本地保留一个缓存备份,后续的每次请求就在本身获得相关的缓存资源文件读取就可以了,可以明显地加快用户的访问速度。css、img、js等文件可以缓存,但是动态程序文件例如php文件不能缓存,即使缓存我们也不要其缓存效果。

(仅有IE浏览器仅在get请求下会缓存动态程序文件,post请求不会缓存)

1.2、IE浏览器缓存现象

在这里插入图片描述

解决办法:让每次的请求的url地址不一样即可,这样就会获取服务器最新的文件内容。

1.3、解决IE浏览器缓存动态文件的方案

(1)设置随机数

Math.random();

直接在open()方法的url参数中追加随机数,目的是改变每次请求的url,url地址不一样,则每次都会请求服务器最新的文件内容

在这里插入图片描述

再次请求则不会读取缓存,因为url地址不一样了:

在这里插入图片描述

通过在url中加随机数,虽然解决了缓存的问题,但是每次请求成功,都会在本地产生一个垃圾动态php文件,会造成本地存储大量的缓存垃圾文件。

在这里插入图片描述

(2)设置时间戳

new Date().getTime();。

设置时间戳和上面设置随机数的原理一样,都是改变url地址,同时也会生成对应请求数的缓存垃圾文件,时间戳从概率论上讲一定是唯一的。

在这里插入图片描述

(3)设置请求头

xhr.setRequestHeader(‘If-Modified-Since’,‘0’); // 值随意不一定是0, 1,2,3,4都可以。

解释:

客户端通过If-Modified-Since头将服务器端最后发过来的页面时间戳发送回去,服务器端通过时间戳判断客户端的页面是否是最新的,如果不是最新的则返回新的内容,如果是最新的,则返回304重定向到客户端缓存中的页面。

示例代码:

在这里插入图片描述
注意:

request.open('get','2-demo.php');
request.setRequestHeader('If-Modified-Since','0');  //必须放在open()的后面

http请求过程,请求头会携带我们所设置的信息:

在这里插入图片描述

结论:通过设置请求头的方式可以解决缓存的问题,只不过多次请求还是会产生一个缓存文件

(4)PHP设置响应头禁止缓存

header(“Cache-Control:no-cache,must-revalidate”);

<?php
header('Cache-Control:no-cache');
header('Pragma:no-cache');
header('Expires:-1');
echo time();

HTTP的请求头标签 If-Modified-Since与Last-Modified
1.基本定义

Last-Modified 与If-Modified-Since 都是标准的HTTP请求头标签,用于记录页面的最后修改时间。

2.发送方向

Last-Modified 是由服务器发送给客户端的HTTP请求头标签

If-Modified-Since 则是由客户端发送给服务器的HTTP请求头标签

3.应用场景

(1)Last-Modified

在浏览器第一次请求某一个URL时,服务器端的返回状态会是200,内容是你请求的资源,同时有一个Last-Modified的属性标记此文件在服务期端最后被修改的时间,格式类似这样:

Last-Modified: Fri, 12 May 2006 18:53:33 GMT

后面跟的时间是服务器存储的文件修改时间

(2)If-Modified-Since

客户端第二次请求此URL时,根据 HTTP 协议的规定,浏览器会向服务器传送 If-Modified-Since 报头,询问该时间之后文件是否有被修改过:

If-Modified-Since: Fri, 12 May 2006 18:53:33 GMT

后面跟的时间是本地浏览器存储的文件修改时间

如果服务器端的资源没有变化,则时间一致,自动返回HTTP状态码304(Not Changed.)状态码,内容为空,客户端接到之后,就直接把本地缓存文件显示到浏览器中,这样就节省了传输数据量。

如果服务器端资源发生改变或者重启服务器时,时间不一致,就返回HTTP状态码200和新的文件内容,客户端接到之后,会丢弃旧文件,把新文件缓存起来,并显示到浏览器中。

以上操作可以保证不向客户端重复发出资源,也保证当服务器有变化时,客户端能够得到最新的资源。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值