代码之家  ›  专栏  ›  技术社区  ›  bcmcfc

当用户用鼠标或键盘回击时,Safari似乎忽略了缓存设置。

  •  5
  • bcmcfc  · 技术社区  · 14 年前

    我有一个页面,一旦点击一个按钮,它就会被一个Ajax微调器替换,同时用户等待下一个页面加载。

    我正在使用.htaccess控制(或试图控制)缓存。如果用户回击(浏览器按钮、鼠标按钮、Alt+Left、Backspace),则需要从缓存重新加载页面。IES 6-8和Chrome都没问题。火狐有一段时间没有工作,最近开始工作,但问题似乎仍然存在于Safari中。这看起来有点奇怪,因为我本以为Safari和Chrome也会这样。

    这是我的.htaccess文件:

    # Add Proper MIME-Type for Favicon
    AddType image/x-icon .ico
    
    <IfModule mod_expires.c>
        ExpiresActive On
    #   ExpiresDefault A2630000
        ExpiresByType image/x-icon A2630000
        ExpiresByType image/gif A2630000
        ExpiresByType image/jpeg A2630000
        ExpiresByType image/png A2630000
        ExpiresByType application/x-javascript M2630000
        ExpiresByType application/javascript M2630000
        ExpiresByType text/css M2630000
    </IfModule>
    
    <IfModule mod_headers.c>
        Header set Cache-Control "public"
        <FilesMatch "\.php$">
            Header set Cache-Control "no-store, no-cache, must-revalidate, max-age=0, post-check=0, pre-check=0"
        </FilesMatch>
    </IfModule>
    
    SetOutputFilter DEFLATE
    
    AddOutputFilterByType DEFLATE text/css
    AddOutputFilterByType DEFLATE application/javascript
    

    我尝试过在没有缓存控制公用线的情况下使用它。

    我还尝试添加:

    AddType application/x-httpd-php .php
    

    用:

    ExpiresByType application/x-httpd-php A0
    

    无济于事。

    我是否遗漏了一些明显的东西?

    编辑:我认为这与缓存设置无关。

    我尝试将此添加到PHP本身:

    #safari test
    if (strstr($_SERVER['HTTP_USER_AGENT'],'Safari')){
        header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
        header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date in the past
    }
    

    即使没有这些行,我也可以在“inspect element”(检查元素)资源中看到正在接收正确的头文件。问题似乎在于,Safari正在努力成为“最快的浏览器”。它似乎明确地忽略了站点开发人员的具体内容——这听起来像是IE最初的思维方式,从以前的表格用于布局的时候开始。

    5 回复  |  直到 12 年前
        1
  •  3
  •   jilles    14 年前

    HTTP规范明确指出,从历史记录调用(后退/前进按钮)不必进行缓存验证。所以这似乎是正确的行为。

        2
  •  1
  •   Mika Tuupola    12 年前

    这种行为是由 back-forward Cache . 你可以进入 onpageshow 当用户使用后退按钮导航时发现的事件。查找调用的属性 persisted . 它在初始页面加载时设置为false。但是,当页面来自bfcache时,它被设置为true。

    然后可以使用javascript强制重新加载页面:

    window.onpageshow = function(event) {
        if (event.persisted) {
            window.location.reload(true) 
        }
    };
    

    或者如果使用jquery:

    $(window).bind("pageshow", function(event) {
        if (event.originalEvent.persisted) {
            window.location.reload(true) 
        }
    };
    
        3
  •  0
  •   davidandrew    14 年前

    我对火狐也有类似的问题,但是用代码修改了.htaccess…

    <IfModule mod_headers.c>
      Header set Cache-Control "public"
      <FilesMatch "\.php$">
          Header set Cache-Control "no-store, no-cache, must-revalidate, max-age=0, post-check=0, pre-check=0"
      </FilesMatch>
    </IfModule>
    

    …具有讽刺意味的是,你的代码里有,为我修正了它。不过,对狩猎问题还不确定。

        4
  •  0
  •   Jacob    14 年前

    尝试将此添加为 meta 在HTML中标记:

    <meta http-equiv="cache-control" content="no-cache, no store, must-revalidate"/>
    
        5
  •  0
  •   amer    14 年前

    Safari给你的是304,而Chrome没有?如果是这样,我怀疑您使用的是Apache2.0,升级到Apache2.2解决了这个问题。