首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >webRequest.onHeadersReceived未触发

webRequest.onHeadersReceived未触发
EN

Stack Overflow用户
提问于 2021-02-19 01:26:22
回答 1查看 367关注 0票数 1

我试图在iFrame中加载一个网站,但是服务器正在发送X-Frame-Options: SAMEORIGIN报头,所以我尝试使用onHeadersReceived来修改报头,尽管我不能让它工作。

manifest.json

代码语言:javascript
运行
复制
{

  "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

代码语言:javascript
运行
复制
<!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

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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侦听器上,它似乎根本不会触发,因为我没有在控制台上得到任何错误或日志。我进行了广泛的搜索,并尝试了我找到的大多数解决方案,但都不适用于我的情况。你能发现我的方法中有什么错误吗?

EN

Stack Overflow用户

回答已采纳

发布于 2021-02-19 03:20:42

Firefox

您需要做的就是从filter对象中删除tabId: -1

代码语言:javascript
运行
复制
browser.webRequest.onHeadersReceived.addListener(
  modifyHeadersCallback,
  { urls: ['<all_urls>'] },
  ['blocking', 'responseHeaders']
);

现代Chrome需要extraInfoSpec参数中的extraHeaders模式,所以iframe的通用代码如下所示:

代码语言:javascript
运行
复制
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模式意味着这个头在内部网络进程中处理,这与浏览器进程是分开的。

票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66265032

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档