为动态创建的Javascript禁用缓存
我已经使用Symfony2在PHP中创建了一个动态javascript(test.js)文件,我不希望浏览器缓存该文件。当我在一个页面中插入脚本test.js两次时,第一次直接从服务器加载,但第二次从浏览器缓存加载脚本。这个问题出现在Chrome和IE上,在Firefox上,一切正常 这里有一个活生生的例子:(如果您看到3个相同的数字,这意味着它是从缓存加载的,如果3个不同的数字是从服务器加载的) 我已经尝试了许多不同的Header()PHP设置,它不会改变任何东西为动态创建的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.
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标记已经存在于多个站点上,所以代码不能更改