(很抱歉这篇文章很长......试着尽可能地简洁。)
我是免费" CMS-like"的唯一志愿者开发者。世界各地超过10,000多名Toastmasters公共演讲俱乐部使用的网站系统。俱乐部输入内容和配置设置,系统使用自定义模板为他们生成免费网站。系统非常动态,因此浏览器缓存管理是一个关键考虑因素。我仍在努力想出一个强大的缓存管理策略,该策略适用于我的所有300,000多个用户的各种浏览器,尽管我在这些论坛中做过与此相关的所有研究。我控制软件的所有方面,Perl服务器代码,MySQL数据库,HTML和JavaScript。我在服务器上设置了带有ExpiresByType的htaccess。
我正在为javascript库,CSS文件等使用缓存生成器查询参数.Perl代码将RevDate查询参数中的补丁修补到HTML中,用于我的自定义javascript文件和我的自定义CSS:
<script src="/js/jQuery-File-Upload/js/jquery.fileupload.js?v=9.9.3"></script>
<script src="/js/FTH/utilities.min.js?2015-06-11"></script>
// In the HTML template: <script src="/js/FTH/utilities.min.js?{{RevDate}}"></script>
我在HTML模板head部分设置了以下Cache Control元参数...(该模板是一个单独的HTML文件,带有Mustache样式的变量和节标记,允许Perl代码根据需要删除部分。)
<meta http-equiv="CACHE-CONTROL" content="NO-CACHE">
<meta http-equiv="PRAGMA" content="NO-CACHE">
<meta http-equiv="Expires" content="-1">
我最近还在下面添加了指示的行,用于将HTTP标头输出到处理模板的Perl例程:
print $COOKIE;
print "Content-type: text/html; charset=UTF-8\n";
# The following have been added to the above...
print "Cache-Control: no-cache\n";
print "Pragma: no-cache\n\n";
(从我正在阅读的内容来看,让服务器输出缓存控制头文件比使用元标记更好,但不确定原因。)
尽管采用了所有这些方法,但如果我还没有在HTML头中包含以下强制重新加载脚本,我仍会遇到与缓存相关的问题(例如,缓存未失效),特别是对于谷歌浏览器:
<script>
{{DOCCOOKIE}} // Set first so that a reload does not lose cookies
(function TriggerReload(){
var getCookieRevDate = function(){
return ((document.cookie.match(/(?:^|; )FTH2\.RevDate=([^;]*)/) || [])[1] || '');
},
RD = getCookieRevDate(),
key = "FTH2.RevDate";
if (RD === "{{RevDate}}") { return; } // Cookie revision date matches server revision date. No reload necessary.
document.cookie = key + "={{RevDate}}; expires=Fri, 31 Dec 9999 23:59:59 GMT; path=/";
if (RD && getCookieRevDate() === "{{RevDate}}"){ location.reload(true); } // Revision date was changed on server, and has been successfully stored locally and read back.
}());
</script>
如果可能的话,我想摆脱这个重新加载脚本,同时保持强大的缓存管理策略。但是,到目前为止,我还没有能够在没有强制重新加载的情况下使系统在Rev Date更改时正确地使缓存的JavaScript和内容无效。最终我的Chrome用户(主要是)抱怨了一些问题,我最终不得不告诉他们进行手动重新加载。 (我有一个链接,它将location.reload(true)作为手动回退供其使用。)
任何人都有任何关于如何改进我正在做的事情的建议,以提供一个有效的缓存管理策略?