Safari Web扩展后台Service Worker发起请求遇CORS问题,求无需改服务端的解法
Safari Manifest v3 扩展 CORS 问题及兼容方案
本扩展采用 Manifest v3 规范,已在 host_permissions 中配置目标域名:
"host_permissions": [ "*://example.com/*" ]
当在 background.js 中执行 fetch("https://example.com") 时,出现以下CORS错误:
[Error] Fetch API cannot load https://example.com/ due to access control checks. [Error] Failed to load resource: Origin safari-web-extension://e0b5d7c7-c079-484b-8825-44d261383cb6 is not allowed by Access-Control-Allow-Origin. Status code: 200 (example.com, line 0)
测试环境
- Safari 16.0(版本号17614.1.25.9.10,17614)
- Safari Technology Preview 153(Safari 16.0,WebKit 17615.1.4.1)
补充说明
- 代码中使用
chrome命名空间测试Chrome浏览器,切换为browser命名空间时问题依旧 - 该扩展直接在Chrome浏览器中加载(chrome://extensions/ → 加载已解压的扩展程序)可正常运行
- Manifest v2 下相同逻辑可正常执行
核心问题
是否存在无需修改服务端访问控制设置即可规避CORS问题的方法?
更新1:临时解决方法
使用 Manifest v3 中已弃用的后台脚本配置替代后台 Service Worker:
替换前(Service Worker 配置):
"background": { "service_worker": "background.js" },
替换后(后台脚本配置):
"background": { "scripts": ["background.js"] },
更新2:跨浏览器兼容方案
- Chrome 仅支持 Service Worker 配置:
"background": { "service_worker": "background.js" },
- Safari 同时支持
service_worker和scripts配置,但使用Service Worker时会触发上述CORS问题
解决方案:针对不同浏览器发布配置不同background字段的扩展包。
内容的提问来源于stack exchange,提问作者Nick Kadutskyi
相关产品推荐
相关产品推荐

