我试图在iFrame中加载一个网站,但是服务器正在发送X-Frame-Options: SAMEORIGIN报头,所以我尝试使用onHeadersReceived来修改报头,尽管我不能让它工作。
manifest.json
{
"manifest_version": 2,
"name": "__MSG_extensionName__",
"description": "__MSG_extensionDescription__",
"default_locale": "en",
"version": "0.1",
"author": "author",
"homepage_url": "https://github.com/",
"icons": {
"48": "assets/icons/logo.png"
},
"background": {
"page": "../../background.html"
},
"content_scripts": [
{
"matches": ["<all_urls>"],
"js": ["scripts/dist/bundle.js"],
"css": ["assets/css/main.css"]
}
],
"permissions": [
"tabs",
"webRequest",
"contextMenus",
"webNavigation",
"webRequestBlocking"
],
"web_accessible_resources": [
"assets/icons/logo.png"
]
}background.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<script type="module" src="scripts/dist/contextMenu.js"></script>
<script type="module" src="scripts/dist/modifyHeaders.js"></script>
</head>
</html>contextMenu.js
browser.contextMenus.create( {
id: "customsearch",
title: "Search",
contexts: ["selection"]
} );
// Context menu onClicked listener
browser.contextMenus.onClicked.addListener( (info, tab) => {
if (info.menuItemId = "custom-search") {
sendMessageToTab(tab, info);
}
} );
function sendMessageToTab(tab, info) {
browser.tabs.sendMessage(
tab.id,
{ query: info.selectionText }
);
}background.js
var extraInfoSpec = ['blocking', 'responseHeaders'];
var filter = {
urls: ['<all_urls>'],
tabId: -1
};
// Bypass X-Frame-Options
browser.webRequest.onHeadersReceived.addListener(
modifyHeadersCallback,
filter,
extraInfoSpec
);
// onHeadersReceived Callback
function modifyHeadersCallback(details) {
let modifiedResponseHeaders = details.responseHeaders.filter(
header => !(header.name.toLowerCase() == 'x-frame-options' || header.name.toLowerCase() == 'content-security-policy')
);
return {responseHeaders: modifiedResponseHeaders};
};上下文菜单按预期工作,问题出在browser.webRequest.onHeadersReceived侦听器上,它似乎根本不会触发,因为我没有在控制台上得到任何错误或日志。我进行了广泛的搜索,并尝试了我找到的大多数解决方案,但都不适用于我的情况。你能发现我的方法中有什么错误吗?
发布于 2021-02-19 03:20:42
Firefox
您需要做的就是从filter对象中删除tabId: -1:
browser.webRequest.onHeadersReceived.addListener(
modifyHeadersCallback,
{ urls: ['<all_urls>'] },
['blocking', 'responseHeaders']
);铬
现代Chrome需要extraInfoSpec参数中的extraHeaders模式,所以iframe的通用代码如下所示:
browser.webRequest.onHeadersReceived.addListener(
modifyHeadersCallback,
{ urls: ['<all_urls>'], types: ['sub_frame'] },
// Modern Chrome needs 'extraHeaders' to see and change this header,
// so the following code evaluates to 'extraHeaders' only in modern Chrome.
['blocking', 'responseHeaders', chrome.webRequest.OnHeadersReceivedOptions.EXTRA_HEADERS]
.filter(Boolean)
);当然,manifest.json中的"permissions"应该包含您想要处理的URL,例如,在本例中它是"<all_urls>"。
所以,这要么是一个bug,要么是一个故意的改变,wasn't documented还没有,所以如果有人想要报告它,请在https://crbug.com上打开一个新的问题。我猜这是故意的,因为extraHeaders模式意味着这个头在内部网络进程中处理,这与浏览器进程是分开的。
https://stackoverflow.com/questions/66265032
复制相似问题