覆盖HTTP响应中的“缓存控制”值

时间:2013-06-29 16:11:36

标签: google-chrome google-chrome-extension http-headers httpresponse cache-control

我有一个网页,当我访问素材时会返回以下标题:

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. Network中的Developer Console标签显示HTTP响应完全没有变化(我尝试将其更改为甚至是微不足道的修改,只是为了确保它不是错误,但仍然没有变化)。
  3. 我能找到的唯一真实提示是this question,这表明我的方法仍然有效,webRequest API documentation上的这一段表明这不起作用(但不能解释我为什么能这样做)没有任何改变):

      

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

    什么都没有用(我根本无法修改HTTP response header)所以我认为这是我的第一个问题。

    对于我可能出错的地方或如何找到问题所在的任何建议?

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

1 个答案:

答案 0 :(得分:5)

我最近花了几个小时尝试缓存文件,发现chrome.webRequestchrome.declarativeWebRequest API 无法强制缓存资源。绝不。

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