禁用动态创建的Javascript

时间:2015-07-11 19:27:57

标签: javascript php symfony caching browser-cache

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

这是一个实例:http://goo.gl/sggKks(如果您看到3次相同的数字意味着它从缓存中加载,如果从服务器加载了3个不同的数字)

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

PS:我不能使用像test.js这样的随机数?r = 923902390来做我需要另外解决方案的技巧

2 个答案:

答案 0 :(得分:0)

如果您无法在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模块。

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

答案 1 :(得分:0)

创意1(基本)

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

<2>想法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