我有一个页面,一旦点击一个按钮,它就会被一个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在当前用于布局的表格中的原始思维方式。
答案 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解决了这个问题。