7

我有一个网页,当我访问材料返回下面的标题中的“缓存控制”值:覆盖在HTTP响应

HTTP/1.1 200 OK 
Date: Sat, 29 Jun 2013 15:57:25 GMT 
Server: Apache 
Content-Length: 2247515 
Cache-Control: no-cache, no-store, must-revalidate, max-age=-1 
Pragma: no-cache, no-store 
Expires: -1 
Connection: close 

使用Chrome扩展,我想修改这个response header使该材料实际上被缓存而不是浪费带宽。

我有下面的示例代码:

chrome.webRequest.onHeadersReceived.addListener(function(details) 
    { 
     // Delete the required elements 
     removeHeader(details.responseHeaders, 'pragma'); 
     removeHeader(details.responseHeaders, 'expires'); 

     // Modify cache-control 
     updateHeader(details.responseHeaders, 'cache-control', 'max-age=3600;') 

     console.log(details.url); 
     console.log(details.responseHeaders); 

     return{responseHeaders: details.responseHeaders}; 
    }, 
    {urls: ["<all_urls>"]}, ['blocking', 'responseHeaders'] 
); 

哪个正确修改了头这样的事情(基于的console.log()输出):

HTTP/1.1 200 OK 
Date: Sat, 29 Jun 2013 15:57:25 GMT 
Server: Apache 
Content-Length: 2247515 
Cache-Control: max-age=3600 
Connection: close 

但基于一切我试图检查一下,我看不出有什么证据表明这实际上已经发生:

  1. cache不包含该文件的条目
  2. Developer Console中的Network选项卡根本没有显示任何HTTP响应的变化(为了确保它不是错误,我尝试将其更改为甚至微不足道的修改)仍然没有变化)。

唯一真正的暗示我能看到的是这表明我的方法仍然有效,并在webRequest API documentation这一段,这表明这是不行的(但没有解释为什么我不能得到任何的改变无论如何):

请注意,网络请求API显示网络 堆栈的扩展抽象。在内部,可以将一个URL请求拆分为若干个HTTP请求(例如,从大文件中获取单个字节范围 ),或者可以由网络堆栈处理,而不需要与网络进行通信 。由于这个原因,API不提供发送到网络的最终HTTP标头, 。例如,对于 示例,与缓存相关的所有标头对 扩展名不可见。

没有任何工作(我根本无法修改HTTP response header),所以我认为这是我首先关心的问题。

任何建议我可能会出错或如何去发现哪里出了问题?

如果不可能,还有其他方法可以实现我想要实现的目标吗?

回答

5

我最近花了试图获取文件缓存几个小时,并且发现chrome.webRequestchrome.declarativeWebRequest的API 不能被缓存力资源。绝不。

Cache-Control(和其他)响应标头可以更改,但它只会在getResponseHeader方法中可见。不在缓存行为。

+0

不幸的是我期待...你知道任何其他方式来强制这些文件缓存吗?我找到了像'squid'这样的代理服务器,但他们似乎在我的系统上摆弄了很多网络来缓存来自一个特定站点的文件。 –

+0

@BT选择您最喜欢的代理,添加正确的头文件,并使用['chrome .proxy'](https://developer.chrome.com/extensions/proxy.html)通过代理路由该特定网站的API。 –

+0

真的很遗憾你不能从扩展中修改缓存。如果可以的话,会让它更有帮助。 –