如何在Chrome扩展MV3中拦截含特定HTTP头的请求?
在Chrome扩展Manifest V3中用declarativeNetRequest拦截含特定HTTP头的请求
要实现拦截Accept-Encoding头包含zip的请求,你可以通过以下步骤配置Chrome扩展MV3的declarativeNetRequest API:
1. 配置Manifest文件
首先在manifest.json中声明必要的权限和规则引用:
{ "manifest_version": 3, "name": "Header-Based Request Blocker", "version": "1.0", "permissions": ["declarativeNetRequest"], "host_permissions": ["<all_urls>"], // 替换为你需要拦截的特定域名,如"https://example.com/*" "declarative_net_request": { "rule_resources": [ { "id": "block_zip_encoding", "enabled": true, "path": "rules.json" } ] } }
declarativeNetRequest:必须声明的权限,用于使用声明式网络请求规则host_permissions:指定要拦截的请求域名范围,<all_urls>表示所有域名,按需缩小范围declarative_net_request.rule_resources:引用外部规则文件,也可以直接在manifest内定义规则(见下文可选方案)
2. 编写拦截规则
创建rules.json文件,定义匹配条件和拦截动作:
[ { "id": 1, "priority": 1, "condition": { "requestHeaders": [ { "header": "Accept-Encoding", "operator": "contains", "value": "zip", "ignoreCase": true // 可选,忽略大小写匹配 } ], "resourceTypes": ["main_frame", "sub_frame", "script", "stylesheet", "image", "font", "object", "xmlhttprequest", "ping", "csp_report", "media", "websocket", "other"] // 按需指定要拦截的资源类型 }, "action": { "type": "block" } } ]
关键字段说明:
condition.requestHeaders:配置请求头匹配规则header:目标请求头名称(区分大小写,除非设置ignoreCase)operator:匹配逻辑,这里用contains表示头值包含指定字符串;其他可选值如equals(完全匹配)、startsWith(前缀匹配)等value:要匹配的目标字符串(这里是zip)
action.type:设置为block即可拦截符合条件的请求,也可以选择redirect、modifyHeaders等其他动作priority:规则优先级,数值越高越先执行(当存在多个规则时生效)
可选:直接在Manifest内定义规则
如果不想用外部规则文件,也可以直接在manifest.json的declarative_net_request中写规则:
"declarative_net_request": { "rules": [ { "id": 1, "priority": 1, "condition": { "requestHeaders": [{"header": "Accept-Encoding", "operator": "contains", "value": "zip"}], "resourceTypes": ["all"] }, "action": {"type": "block"} } ] }
测试验证
- 在Chrome浏览器中打开
chrome://extensions/,启用开发者模式,加载已解压的扩展 - 使用开发者工具的网络面板,或者用curl模拟请求:
curl -H "Accept-Encoding: gzip, zip" https://example.com - 查看扩展的规则状态:打开
chrome://extensions/-> 你的扩展 -> 详情 -> 查看规则,确认规则已启用
注意事项
- 确保
host_permissions覆盖了你要拦截的请求域名,否则规则不会生效 - 如果需要匹配多个请求头,可以在
requestHeaders数组中添加多个规则项 ignoreCase参数默认是false,如果需要不区分大小写匹配,记得显式设置为true
内容的提问来源于stack exchange,提问作者SantK
相关产品推荐
相关产品推荐

