禁用动态创建的缓存 Javascript

Disable cache for dynamic created Javascript

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

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

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

PS:我不能使用像 test.js?r=923902390 这样的随机数来实现我需要另一个解决方案

如果您不能在 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 文件定义为路由,并在你的控制器响应中设置这些 headers。

想法 1(基本)

在客户端生成 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