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

时间:2010-08-06 09:41:23

标签: .htaccess caching safari

我有一个页面,一旦点击一个按钮,它就会被一个Ajax微调器取代,而用户则等待下一页加载。

我正在使用.htaccess控制(或尝试控制)缓存。如果用户返回(浏览器按钮,鼠标按钮,alt + left,退格键),则需要从缓存中重新加载页面。 IE 6-8和Chrome都很好用。 Firefox暂时没有工作,最近开始工作,但问题似乎仍然存在于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

我已经尝试过使用和不使用Cache-Control公共线路。

我也尝试过添加:

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”中看到的行&gt;正在接收正确标头的资源。问题似乎是Safari正在与他们合作以成为“最快的浏览器”。它似乎明确地忽略了网站开发人员的具体内容 - 这听起来就像IE在当前用于布局的表格中的原始思维方式。

5 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

此行为是由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) 
    }
};

答案 2 :(得分:0)

我遇到了与firefox类似的问题但是用代码修改了.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>
讽刺的是,具有讽刺意味的是,你的代码已经为我修好了。但不确定Safari的问题。

答案 3 :(得分:0)

尝试将其添加为HTML中的meta标记:

<meta http-equiv="cache-control" content="no-cache, no store, must-revalidate"/>

答案 4 :(得分:0)

Safari是否提供304而Chrome不提供?如果是这样,我怀疑你正在使用Apache 2.0并升级到Apache 2.2解决了这个问题。