在网站的响应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)
答案 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;因此不允许访问。