我合作的一家公司有一个通过慢速 DSL 线路托管的 Web 应用程序。他们的服务器配置或所用软件版本存在问题,这意味着每次访问页面都会触发大量 JavaScript 库的下载。根据 Firebug 的说法,每个页面的实际内容交付速度相对较快。
有没有办法强制 Firefox 认为某个特定的 URL 具有较长的有效期?
很多年前,我曾经在 squid 代理安装上做过这种事情,使用自定义正则表达式规则强制对行为不当的网站设置最低缓存期限。我尝试做的事情似乎类似,但纯粹是客户端的。
答案1
操纵特定的缓存条目实际上是不可能的,甚至 Firefox 扩展也没有这种级别的访问权限。但是可以操纵服务器返回的标头。不幸的是,所有现有的扩展都专注于操纵请求标头而不是响应标头。但用于此的扩展确实很简单。所以也许您想在再次安装 Squid 之前尝试这种方法。以下是此类扩展的代码:
安装.rdf
<?xml version="1.0" encoding="utf-8"?>
<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:em="http://www.mozilla.org/2004/em-rdf#">
<Description about="urn:mozilla:install-manifest">
<em:id>[email protected]</em:id>
<em:version>1.0</em:version>
<em:type>2</em:type>
<em:bootstrap>true</em:bootstrap>
<!-- Firefox -->
<em:targetApplication>
<Description>
<em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id>
<em:minVersion>8.0</em:minVersion>
<em:maxVersion>99.0</em:maxVersion>
</Description>
</em:targetApplication>
<!-- Front End MetaData -->
<em:name>Caching header manipulation</em:name>
</Description>
</RDF>
bootstrap.js
Components.utils.import("resource://gre/modules/Services.jsm");
Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
function install(data, reason) {}
function uninstall(data, reason) {}
function startup(data, reason)
{
Services.obs.addObserver(Observer, "http-on-examine-response", true)
};
function shutdown(data, reason)
{
Services.obs.removeObserver(Observer, "http-on-examine-response")
};
var Observer =
{
observe: function(subject, topic, data)
{
if (subject instanceof Components.interfaces.nsIHttpChannel &&
subject.URI.host == "cdn.sstatic.net")
{
subject.setResponseHeader("Cache-Control", "max-age=2592000", false);
}
},
QueryInterface: XPCOMUtils.generateQI([
Components.interfaces.nsIObserver,
Components.interfaces.nsISupportsWeakReference
])
};
将这两个文件放入 ZIP 存档中并将其重命名为headermanip.xpi
- 完成后,您将获得一个扩展,它将更改来自cdn.sstatic.net
(在此网站上使用)的任何内容的缓存标头,使其在 30 天后过期,而不是通常的 7 天。如果您希望它发生在不同的主机上 - 更改签subject.URI
入bootstrap.js
。您还可以检查subject.URI.spec
是否要查看完整的 URL 而不是仅查看主机。
答案2
这BetterCache插件看起来很有前途,但它的白名单和黑名单似乎只适用于 MIME 类型,而不适用于 URL,并且根据评论,text/javascript
应该将其列入黑名单才能使某些验证码正常工作。
我认为没有内置的方法可以做到这一点。
...
...
这时有人证明我错了。
您始终可以在本地(在同一台计算机上)安装 squid,从技术上讲这是客户端……