我已经使用Symfony2在PHP中创建了一个动态javascript(test.js)文件,我不希望浏览器缓存此文件。当我在一个页面中插入脚本test.js 2次时,它第一次直接从服务器加载,但是第二次从浏览器缓存加载脚本。这个问题出现在Chrome和IE上,在Firefox上一切正常。
这是一个实例:http://goo.gl/sggKks(如果您看到3次相同的数字意味着它从缓存中加载,如果从服务器加载了3个不同的数字)
我尝试过很多不同的Header()PHP设置,它没有改变任何东西。
PS:我不能使用像test.js这样的随机数?r = 923902390来做我需要另外解决方案的技巧
答案 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)
在客户端的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