禁用动态创建的Javascript缓存


Disable cache for dynamic created Javascript

我已经创建了一个动态javascript (test.js)文件在PHP与Symfony2和我不希望这个文件被浏览器缓存。当我在一个页面中插入脚本test.js 2次时,第一次它直接从服务器加载,但第二次脚本从浏览器缓存加载。这个问题出现在Chrome和IE上,在Firefox上一切正常。

下面是一个生动的例子:http://goo.gl/sggKks(如果你看到3个相同的数字,意味着它是从缓存加载的,如果3个不同的数字,它是从服务器加载的)

我已经尝试了许多不同的Header() PHP设置,它没有改变任何东西。

PS:我不能使用随机数像test.js?R =923902390我需要另一个解

创意1 (basic)

在客户端javascript中生成内容随机性。让javascript多工作一点。这可能是我们应该做的。这样更合理。除非这是不可能的。

想法2(不太合理,可能过度设计)

让脚本检查自己的url并加载另一个(随机的)副本。

// self contained auto cloning facility
(function(){
   // see http://www.2ality.com/2014/05/current-script.html
   var currentScript = document.currentScript || (function() {
      var scripts = document.getElementsByTagName('script');
      return scripts[scripts.length - 1];
   })();
   // get script tag url (self)
   var url = currentScript.getAttribute('src');
   // url doesn't have random part
   if(!url.match(/'?'d+$/)) {
      // create new script tag with random part
      var s = document.createElement('script');
      s.src = url+'?'+Math.round(Math.random()*1000000000);
      document.body.appendChild(s);
      // engage wild brakes
      throw "stop";
   }
})();
// do the actual job below this point

如果你不能在URL中添加动态参数(如果我认为这是实现你想要做的事情的最好方法),你可以像这样禁用。htaccess缓存:

<filesMatch "'.js$">
  FileETag None
  <ifModule mod_headers.c>
     Header unset ETag
     Header set Cache-Control "max-age=0, no-cache, no-store, must-revalidate"
     Header set Pragma "no-cache"
     Header set Expires "Wed, 11 Jan 1984 05:00:00 GMT"
  </ifModule>
</filesMatch>

你需要激活Apache Header模块。

如果你不能使用这个,你应该在Symfony中将JS文件定义为一个路由,并在你的控制器响应中设置这些头文件。