网站缓存问题

1,公司的网站全是静态页面组成,每当发布完成之后,用户访问的时候还是老的页面。

2,清除历史记录,再次访问 访问到的才是新的页面。

3,但是一直清除历史记录不太现实,所以请问各位有什么好的解决方案?

谢谢!

阅读 6k
12 个回答

在访问链接url后面加上"?time=" + new Date().getTime(); 当然随机数也行

加版本号即可,或者设置cache-control

优雅一点的方法,可以用webpack,gulp之类的工具编译打包你的js,css等文件,然后添加版本号。
一般一点的方法,修改完js或者css之后,你自己手动给文件添加一个后缀(比如时间戳),例如,原来的js名叫"index.js",那你修改了一些代码之后,上线之前可以将其修改为"index20170913.js"。用户端浏览器就会加载你最新的js了。
这个问题主要是浏览器缓存的问题,一般浏览器为了性能考虑会把js,css文件缓存在用户本地,这样等用户再次访问这个网页的时候就可能不会再去下载这些资源。所以,给你的资源改个名就好了。
还是看你的业务情况吧,我觉得静态网站可能js的量会稍小一点,所以可以这样手动去改。但真心建议引入webpack,项目比较大的话,手动改根本不现实。
看你的标签里引入node.js,也可以你用node写一个脚本,自动地去更改js的名字,注意,还需要改html里引入的js名字哦!

如果是全静态页面那按理说是可以通过打包工具在所有链接上添加版本号
不然就得通过web服务器控制缓存规则(减小缓存时间)

调整缓存策略,比如使用Last-Modified、ETag。

加版本号是目前通用的做法 如果静态页面不算大的话可以设置cache-control不做缓存

可以让它在一定时间自动更新,比如设置一个5分钟自动更新一次!

方法:

设置一个缓冲更新的时间:
    $cacheTime = 10*30
获取到文件的路径:
    $cacheFile = "cache/static.html";
在每次获取静态页面的时候利用filemtime获取到文件修改的时间:
    if(file_exists($cacheFile) && time() - $cacheTime > filemtime($cacheFile)) {
        ...一些代码...
    }
当用户访问的时候,如果已经过了 300 秒,那么就重新生成新的静态页面。

每次都即时显示,那还要做缓存干什么。你在CDN服务器做静态分发的时候是会制定策略的,而且发布以后可以在CDN那边清理缓存,针对CSS和JS文件的缓存,加上对应版本号,就可以确保每次更新的时候获取的是最新的,图片直接缓存一年都没问题,页面一般根本不会频繁更改的,所有需要的数据都是ajax异步加载来的。所以,你主要对JS和CSS做好处理就可以了。

根据楼主的场景,最简单的方式就是设置Cache-Control: no-cache,意思就是,每次用户访问页面,都需要跑到服务器校验本地副本是否过期。如果过期,服务器返回新的网页。

更详细复杂的设置,比如设置缓存时长等,可以参考《web性能优化之:no-cache与must-revalidate深入探究

看你的标签有nodejs,你可以用gulp之类的工具,帮你hash文件名——这其实是CDN最佳实践的一种。因为只要文件发生变化,那么hash文件名就会发生变化,这样用户会立刻获取到最新的资源,并一直缓存到过期。

如果你使用的是angular这样的工程项目,甚至angular-cli自带产品环境打包就有hash文件名的功能,这属于前端最佳实践。

方法:

linux conrtab 定时任务 每隔2小时 清理一次缓存

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题