为动态创建的Javascript禁用缓存

为动态创建的Javascript禁用缓存,javascript,php,symfony,caching,browser-cache,Javascript,Php,Symfony,Caching,Browser Cache,我已经使用Symfony2在PHP中创建了一个动态javascript(test.js)文件,我不希望浏览器缓存该文件。当我在一个页面中插入脚本test.js两次时,第一次直接从服务器加载,但第二次从浏览器缓存加载脚本。这个问题出现在Chrome和IE上,在Firefox上,一切正常 这里有一个活生生的例子:(如果您看到3个相同的数字,这意味着它是从缓存加载的,如果3个不同的数字是从服务器加载的) 我已经尝试了许多不同的Header()PHP设置,它不会改变任何东西 PS:我不能使用像test.

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

这里有一个活生生的例子:(如果您看到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>

FileTag无
标题未设置ETag
标题集缓存控制“最大年龄=0,无缓存,无存储,必须重新验证”
标题集Pragma“无缓存”
标题集过期“1984年1月11日星期三05:00:00 GMT”
您需要激活Apache头模块


如果无法使用此选项,则应在Symfony中将JS文件定义为路由,并在控制器响应中设置这些头。

如果无法在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>

FileTag无
标题未设置ETag
标题集缓存控制“最大年龄=0,无缓存,无存储,必须重新验证”
标题集Pragma“无缓存”
标题集过期“1984年1月11日星期三05:00:00 GMT”
您需要激活Apache头模块

如果无法使用此选项,则应在Symfony中将JS文件定义为路由,并在控制器响应中设置这些标题。

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

这让我想知道浏览器级别的优化技术。因为它是完全相同的资源,chrome或IE会麻烦提出3个请求吗?如果我们相信,IE11网络控制台只显示一个js文件请求。不了解Chrome。请尝试为提供javascript文件的URL设置
No cache
指令,例如:David,我不是在使用symphony,而是在使用symfony2。这对我没有帮助你能解释一下为什么你不能修改url吗?这将有助于排除这些想法。因为它是针对广告网络的,而且javascript标记已经在多个站点上存在,代码无法更改。这让我对浏览器级别的优化技术感到好奇。因为它是完全相同的资源,chrome或IE会麻烦提出3个请求吗?如果我们相信,IE11网络控制台只显示一个js文件请求。不了解Chrome。请尝试为提供javascript文件的URL设置
No cache
指令,例如:David,我不是在使用symphony,而是在使用symfony2。这对我没有帮助你能解释一下为什么你不能修改url吗?这将有助于排除这些想法。因为它是针对广告网络的,而且javascript标记已经存在于多个站点上,所以代码不能更改