如何覆盖用crossorigin =" anonymous"引用的javascript文件?使用谷歌浏览器扩展程序?

时间:2014-06-20 01:36:23

标签: javascript google-chrome-extension cross-domain cors

在网站的响应HTML中,使用http://www.example.com这样的域,引用了许多javascript文件。其中一个引用了不同域上的javascript文件,此脚本标记设置了crossorigin="anonymous"属性:

<script crossorigin="anonymous" src="//cdn.example.net/script.js"></script>

我尝试使用Google Chrome扩展程序将请求重定向到另一个网址:

chrome.webRequest.onBeforeRequest.addListener(function(info) {
    return {
        redirectUrl: "http://example.org/custom.js"
    };
}, {
    urls: [
        "*://cdn.example.net/script.js"
    ],
    types: ["script"]
}, ["blocking"]);

但是,当我尝试加载网站时,我在javascript控制台中收到错误:

  

原点http://cdn.example.net的重定向已被跨源资源共享策略阻止加载:收到无效响应。
  因此,不允许原点http://www.example.com访问。

如果我手动拦截回复HTML(在Chrome之外)并删除属性crossorigin="anonymous",则按预期工作。

我将http://example.org/custom.js的文件设置为发送:

Access-Control-Allow-Origin: *

我也尝试过来自www.example.com的{​​{3}},但这似乎没有什么区别。主框架的响应头(供参考)是:

HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Transfer-Encoding: chunked
Vary: Accept-Encoding
Status: 200 OK
X-XSS-Protection: 1; mode=block
X-Content-Type-Options: nosniff
X-UA-Compatible: chrome=1
Cache-Control: no-cache, no-store
X-Frame-Options: SAMEORIGIN
P3P: CP="NOI DSP COR NID ADMa OPTa OUR NOR"
Content-Encoding: gzip

还有其他javascript文件在此之后加载,并依赖于它,我希望保留原样。

同样,主要问题似乎是crossorigin="anonymous"标签(我可以说它的主要目的是选择removing / modifying the response headers

如何编写Google Chrome扩展程序以覆盖从此来源执行的javascript?

1 个答案:

答案 0 :(得分:2)

您尝试的解决方案无法正常运行,因为CORS的唯一相关标头是原始资源提供的标头。如果此CORS检查成功,则检查重定向,依此类推。

但是,最初的CORS检查似乎已经失败了......我已经在https://code.google.com/p/chromium/issues/detail?id=387198报告了这个错误。

有一种解决方法。自Chromium 35.0.1911.0起,您可以在chrome.webRequest.onHeadersReceived事件中重定向请求。如果您将access-control-allow-origin: *redirectUrl一起设置,则在此阶段重定向跨源请求似乎有效。这种方法的一个小缺点是请求不会立即重定向,而是仅在收到来自原始请求的响应之后。如果原始请求导致错误,例如404,然后你的重定向根本不会发生。然而,在修复bug之前,这是获得所需效果的唯一方法。

chrome.webRequest.onHeadersReceived.addListener(function(info) {
    return {
        responseHeaders: info.responseHeaders.concat([{
            name: 'access-control-allow-origin',
            value: '*' 
        }]),
        redirectUrl: "http://localhost:2222/custom.js"
    };  
}, {
    urls: [
        "*://example.net/script.js"
    ],  
    types: ["script"]
}, ["blocking", "responseHeaders"]);

注意:无论采用何种方法,重定向的目标必须还包含相应的access-control-allow-origin标头,否则请求仍将中止,并显示以下错误:

  

在原点重定向&#39; http://example.net&#39;已被跨源资源共享策略阻止加载:No&#39; Access-Control-Allow-Origin&#39;标头出现在请求的资源上。起源&#39; http://localhost:4444&#39;因此不允许访问。