如何有效管理类似CMS的浏览器缓存"网站

时间:2015-06-12 03:27:41

标签: javascript html css perl caching

(很抱歉这篇文章很长......试着尽可能地简洁。)

我是免费" 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)作为手动回退供其使用。)

任何人都有任何关于如何改进我正在做的事情的建议,以提供一个有效的缓存管理策略?

0 个答案:

没有答案