禁用动态创建的缓存 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
我已经使用 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