我已经创建了一个动态javascript (test.js)文件在PHP与Symfony2和我不希望这个文件被浏览器缓存。当我在一个页面中插入脚本test.js 2次时,第一次它直接从服务器加载,但第二次脚本从浏览器缓存加载。这个问题出现在Chrome和IE上,在Firefox上一切正常。
下面是一个生动的例子:http://goo.gl/sggKks(如果你看到3个相同的数字,意味着它是从缓存加载的,如果3个不同的数字,它是从服务器加载的)
我已经尝试了许多不同的Header() PHP设置,它没有改变任何东西。
PS:我不能使用随机数像test.js?R =923902390我需要另一个解
创意1 (basic)
在客户端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
如果你不能在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文件定义为一个路由,并在你的控制器响应中设置这些头文件。