• 手机浏览器缓存和电脑浏览器缓存的问题记录


      一、背景描述:

      为了优化web网页速度,我们采取了js,css合并压缩,并在服务端控制。所以我就学习了一下,浏览器缓存的原理。

      因为我不想使用版本号控制,版本号具有诸多弊端:

           1.每次修改都得修改版本号。

           2.如果所有页面的引用,单独配置版本号,那么每次的修改量很大;

           3.如果为了避免2的问题,针对所有页面使用同一个熟悉配置,那么每次修改一个文件并更新版本号之后,所有的引用的版本号都更新了,太傻了。

        所以,不采取版本号控制,使用时间控制,页面引用不用变,目标文件发生了变化,服务器能告诉客户端浏览器。

         页面使用如下方式请求当前页面的css样式文件:

        <link type="text/css" rel="stylesheet"  href="<s:text name='compressURL'/>/dynamic.css?p=dd&urls=xxx,yyy" />

         服务器处理方法:

      1.由于使用版本号,在每次修改的时候都得修改版本号,嫌麻烦,所以采取在服务端使用文件修改时间控制,利用http的If-Modified-Since。

         2.检测文件修改时间,和浏览器传过来的If-Modified-Since比较,如果需要更新,返回200,向浏览器发送最新数据;

         3.如果不需要更新返回304 ,浏览器就会拿本地的缓存,不需要消耗流量和等待数据传输,节约时间和流量 (此处不详细描述,如何控制304和200具体实现)

        二、 出现问题

        PC端浏览器:一切正常,达到了最初的目的:样式文件没有更新则返回304,浏览器继续使用缓存;

            下次样式文件更新了,客户端浏览器请求时,将得到200的返回值并接收新的文件;

        手机端自带浏览器/微信里边的浏览器:部分手机行,部分手机不行。表现的现象为:第一次请求在本地缓存了样式文件,第二次样式文件修改了他也没有更新。

               我用多部手机测试,发现当服务端文件变动之后,小米2S手机能及时得到文件更新,同事三星机型也能及时得到最新文件,而IPHONE和华为的不行。

     经测试总结发现:IPHONE和华为的手机在第一次访问网页之后,就把样式文件缓存起来了,第二次直接没有变动(实际上根本就没有向服务器发送请求,没有询问服务器是否更新)

       即:1.电脑第一次访问的时候下载文件,以后每次会每次询问服务器是否更新,304则不更新,200则更新(可以完全在服务端控制)     

             2.部分手机端浏览器和微信里的浏览器,只在第一次访问的时候下载文件,只要url不改变,以后根本就没有再次请求(可能是浏览器为了给省流量,和提速);

        三、解决办法

        如果是电脑端使用,我这个解决方案,没问题,用的很爽;

       如果是手机访问,还是得加版本号,我之前就是嫌弃加版本号麻烦,所以才没采用,实在是没办法,只有让url地址发生改变 那个傻逼浏览器才发送请求,才能拿到新的文件。

      

     

     

  • 相关阅读:
    android自定义透明dialog菜单
    webserice bug大全
    android五大布局居中对齐方式
    解决vs2010无法找到html页的问题
    android 旋转按钮和旋转变化动画
    android上画方框
    与Python有关的 备忘
    Python存取XML方法简介
    转载dll与lib之间的区别
    MSVCP100.dll 丢失的问题
  • 原文地址:https://www.cnblogs.com/demingblog/p/4172173.html
Copyright © 2020-2023  润新知