
最近开发 chrome MV3 扩展程序,需要在 service worker 后台需要对一个网站的主页发起 http 请求,请求需要模拟用户在浏览器标签界面正常访问。
用户正常访问一个网站时,请求头包含如下特殊字段:
Sec-Ch-Ua: "......" Sec-Ch-Ua-Mobile: ?0 Sec-Ch-Ua-Platform: "Windows" Sec-Fetch-Dest: document Sec-Fetch-Mode: navigate Sec-Fetch-Site: none Sec-Fetch-User: ?1 在 worker 后台使用 fetch(url, options),请求头却如下:
Sec-Fetch-Dest: empty Sec-Fetch-Mode: cors Sec-Fetch-Site: none 二者明显不一样,网站可以通过请求头 Sec-Ch-xxx、sec-fetch-xxx 判断是否是正常访问。 然而尝试设置 fetch 的 options 覆盖 headers:
options.headers = { 'Sec-Ch-Ua': '......', 'Sec-Ch-Ua-Mobile': '?0', 'Sec-Ch-Ua-Platform': '"Windows"', 'Sec-Fetch-Dest': 'document', 'Sec-Fetch-Mode': 'navigate', 'Sec-Fetch-Site': 'none', 'Sec-Fetch-User': '?1', } 并没有用, Sec-Ch-xxx、sec-fetch-xxx 这些特殊请求头根本不能设置。
尝试设置 options.mode = 'navigate',则直接保存。
请问有任何办法设置这些特殊请求头吗?
1 CLMan 2023 年 5 月 11 日 根据我的少量的扩展开发经验,扩展提供的 API ,无论是内容脚本还是 worker ,都是受到浏览器安全策略限制的。 在 worker 进行 fetch 时,浏览器会使用 CORS 的方式来请求数据,我还没测试过设置 permissions 是否有效果。 至于内容脚本,似乎 cors 是不允许的(不太确定),只能访问同源的资源。 两者提供的 fetch/ajax api 都是受限的,并不是 local api 那样随意,要想不受限,可能要使用服务端来进行请求转发。 |
2 einsdisp OP 打错了,`尝试设置 options.mode = 'navigate',则直接保存。` 保存 => 报错 |
3 feedcode 2023 年 5 月 11 日 proxy- 和 sec- 在 W3C Forbidden header name 里 https://developer.mozilla.org/en-US/docs/Glossary/Forbidden_header_name |
4 CLMan 2023 年 5 月 11 日 感谢分享,原来这一系列头信息有更专业的术语描述。 |
5 xifangczy 2023 年 5 月 12 日 chrome.declarativeNetRequest API 可以修改 |
6 xifangczy 2023 年 5 月 12 日 chrome.declarativeNetRequest.updateSessionRules({ removeRuleIds: [1], addRules: [{ "id": 1, "action": { "type": "modifyHeaders", "requestHeaders": [{ "header": "Sec-Ch-Ua", "operation": "set", "value": "test" }] }, "condition": { "resourceTypes": ["xmlhttprequest"] } }] }, function () { // fetch 请求... }); |
7 forty 2023 年 5 月 12 日 chrome.declarativeNetRequest API 正解 |
8 japhetjiu699 2024 年 11 月 22 日 @xifangczy #6 补充 permissions: 加这两个参数 "declarativeNetRequestWithHostAccess", "declarativeNetRequestFeedback" |