我能用Chrome扩展程序修改发出的请求头吗?

70
我在开发者指南中没有找到关于这个问题的答案,但可能是我没有找到正确的地方。
我想用Chrome扩展截取HTTP请求,然后将其转发,可能会有新的/不同的HTTP头,我该如何做?

这是我能找到的最接近的链接:http://code.google.com/chrome/extensions/content_scripts.html - Romain Hippeau
考虑更改已接受的答案。当前已接受的答案已经过时。新答案是正确的。 - Rob W
如果/当那个答案被更新为实际的解释和如何操作的示例,我会将其标记为解决方案。仅有一个链接并不是一个答案。 - Peter Boughton
@PeterBoughton 刚刚发生了这件事。 - Xan
还有相关内容:https://dev59.com/JGYq5IYBdhLWcg3wui_F#29832996 - mgilson
@mgilson 这与此无关。您提供的链接允许您将请求复制为cURL,并手动修改标头,然后发送请求。OP想要在Chrome浏览器内使用Chrome扩展程序完成此操作。 - Sachin Jain
8个回答

78

注: 我是Requestly的作者 - 一款Chrome/Firefox浏览器扩展程序,可以修改HTTP请求和响应。

在OP提出问题时这是不可能实现的,但现在您可以使用Manifest V2中的WebRequest API和Manifest V3中的DeclarativeNetRequest API编写自己的扩展程序来修改请求和响应头部信息。

Manifest V2代码

chrome.webRequest.onBeforeSendHeaders.addListener(
  function(details) {
    for (var i = 0; i < details.requestHeaders.length; ++i) {
      if (details.requestHeaders[i].name === 'User-Agent') {
        details.requestHeaders.splice(i, 1);
        break;
      }
    }
    return { requestHeaders: details.requestHeaders };
  },
  {urls: ['<all_urls>']},
  ['blocking', 'requestHeaders' /* , 'extraHeaders' */]
  // uncomment 'extraHeaders' above in case of special headers since Chrome 72
  // see https://developer.chrome.com/extensions/webRequest#life_cycle_footnote
);

谷歌Chrome正在Manifest V3中淘汰webRequest Blocking API。根据谷歌于2022年9月28日的官方声明,从2023年6月开始,所有使用Manifest v2的扩展程序将无法在Chrome上运行。以下是一种使用Manifest v3修改请求和响应标头的方法- https://github.com/requestly/modify-headers-manifest-v3

Manifest V3 代码:

rules.ts

const allResourceTypes = 
    Object.values(chrome.declarativeNetRequest.ResourceType);

export default [
  {
    id: 1,
    priority: 1,
    action: {
      type: chrome.declarativeNetRequest.RuleActionType.MODIFY_HEADERS,
      requestHeaders: [
        {
          operation: chrome.declarativeNetRequest.HeaderOperation.SET,
          header: 'x-test-request-header',
          value: 'test-value',
        },
      ]
    },
    condition: {
      urlFilter: '/returnHeaders',
      resourceTypes: allResourceTypes,
    }
  },
  {
    id: 2,
    priority: 1,
    action: {
      type: chrome.declarativeNetRequest.RuleActionType.MODIFY_HEADERS,
      responseHeaders: [
        {
          operation: chrome.declarativeNetRequest.HeaderOperation.SET,
          header: 'x-test-response-header',
          value: 'test-value',
        },
      ]
    },
    condition: {
      urlFilter: 'https://testheaders.com/exampleAPI',
      resourceTypes: allResourceTypes,
    }
  },
];

背景.ts

import rules from './rules';

chrome.declarativeNetRequest.updateDynamicRules({
  removeRuleIds: rules.map((rule) => rule.id), // remove existing rules
  addRules: rules
});

完整的源代码可以在GitHub存储库中找到- https://github.com/requestly/modify-headers-manifest-v3

如果您想使用现有的Chrome/Firefox/Edge扩展程序,您可以使用Requestly,它允许您修改请求和响应头。看一下这个快照:

Headers Rule Screenshot


12
我会尽力进行翻译:我会淡化广告。1)你应该明确披露这是你自己的创作,2)也许一个巨大的截屏不太合适。 - Xan
7
@Xan,我添加了PPS说明“我是作者”。你是对的,我应该一开始就这样做。快照可能有点不恰当,我会把它放在这里。如果你坚决认为它不应该在那里,请将其删除。我没关系。感谢您的回复,我很感激。 - Sachin Jain
51
谢谢,blunderboy。不用担心——你的图像非常好。从存储库链接中就可以自然地看出它是由你创作的。考虑到你首先识别了API并展示了示例代码(更不用说这是一个开源项目),为它被视为“广告”而唠叨是非常愚蠢的事情。 - Peter Boughton
4
我很高兴-使用Requestly,我在2分钟内完成了我的小测试,而原来需要编写API代码耗时超过20分钟。 - Fletch
2
+1 - 使用它来调试Ajax,设置为Modify Headers -> Add -> Request -> "X-Requested-With" -> "XMLHttpRequest"。 - Theraot
显示剩余9条评论

12

6

对于使用清单版本3的扩展程序,你不能再使用chrome.webRequest.onBeforeSendHeaders.*。替代方案是chrome.declarativeNetRequest

在你的manifest.json文件中进行以下更改:

{
  ...
  "manifest_version": 3,
  "background": {
    "service_worker": "background.js"
  },
  "host_permissions": ["<all_urls>"],
  "permissions": [
    "declarativeNetRequest"
  ],
  ...
}
  • "<all_urls>" 用于修改所有传出URL的头信息。限制为你的工作范围。

在你的 background.js 中进行以下更改:

// ...

const MY_CUSTOM_RULE_ID = 1

chrome.declarativeNetRequest.updateDynamicRules({
    removeRuleIds: [MY_CUSTOM_RULE_ID],
    addRules: [
        {
            id: MY_CUSTOM_RULE_ID,
            priority: 1,
            action: {
                type: "modifyHeaders",
                requestHeaders: [
                    {
                        operation: "set",
                        header: "my-custom-header",
                        value: "my custom header value"
                    }
                ]
            },
            condition: {
                "resourceTypes": ["main_frame", "sub_frame"]
            },
        }
    ],
});

结果

输入图像描述

阅读文档https://developer.chrome.com/docs/extensions/reference/declarativeNetRequest/


在我自己寻找使用Manifest V3添加更新时,刚好遇到了这个。我为此点了一个赞。谢谢,Jossef! - Kaushik

4

请记住,从Chrome 72开始,除非您在opt_extraInfoSpec中添加extraHeaders,否则某些标头是不允许的。 因此,@sachinjain024答案中的示例将如下所示:

chrome.webRequest.onBeforeSendHeaders.addListener(
  function(details) {
    for (var i = 0; i < details.requestHeaders.length; ++i) {
      if (details.requestHeaders[i].name === 'User-Agent') {
        details.requestHeaders.splice(i, 1);
        break;
      }
    }
    return { requestHeaders: details.requestHeaders };
  },
  {urls: ['<all_urls>']},
  [ 'blocking', 'requestHeaders', 'extraHeaders']
);

如需更多信息,请查阅文档 文档截图 https://developer.chrome.com/extensions/webRequest#life_cycle_footnote


3

您来到了正确的地方,但是拦截HTTP请求目前还不存在,不过扩展团队已经意识到这是一个广受欢迎的需求,并计划在不久的将来实现它。


2
你可以安装ModHeader扩展程序并添加头文件:

enter image description here


1
如何使用此扩展程序删除标题? - ssi-anik
1
你只能删除你自己添加的标题。 - Taras Melnyk
2023年9月28日警告:此扩展将在网页上添加谷歌广告。 - undefined
是的,你完全可以这样做,然后ModHeader会偷偷地在你的谷歌搜索结果页面上注入广告。这样做不太好。 - undefined
1
这个现在在谷歌搜索结果页面注入广告。 - undefined

1

您可以使用已经过时的WebRequest API来修改请求/响应头。 您可以将您的扩展升级到Manifest V3,以便能够使用DeclativeNetRequest,它也支持修改请求/响应头。

或者您可以安装Inssman Chrome扩展程序。 它允许您修改HTTP(S)请求/响应头,重定向和阻止请求,返回自定义数据,如HTML/CSS/JS/JSON等等。 而且它是一个开源项目。

Inssman

enter image description here


0
我刚刚试了Chrome,FireFox和Edge。
在没有安装任何扩展的情况下,只有Edge允许我替换头部的"referer"并重新发送。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接