You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Firefox扩展内容脚本无法发起XMLHttpRequest/Fetch请求求助

解决Firefox扩展内容脚本XHR/Fetch请求异常的方案

我之前踩过Firefox扩展内容脚本跨域请求的坑,结合你描述的情况(已经禁用Django的CORS但仍报错),大概率是以下几个原因导致的,给你逐个排查的方案:

1. 扩展权限配置缺失(最常见原因)

Firefox扩展的内容脚本受限于manifest.json的权限策略,哪怕你关掉了后端的CORS,只要没在扩展里声明允许访问目标服务器的权限,请求就会被拦截。

  • 如果你的扩展用的是Manifest V3,需要添加host_permissions:
{
  "manifest_version": 3,
  "name": "你的扩展名称",
  "version": "1.0",
  "content_scripts": [
    {
      "matches": ["<all_urls>"], // 替换成你需要注入内容脚本的页面匹配规则
      "js": ["content.js"]
    }
  ],
  "host_permissions": ["http://127.0.0.1:8000/*"] // 明确允许访问本地Django服务器
}
  • 如果是Manifest V2,则在permissions数组里添加目标地址:
{
  "manifest_version": 2,
  // ...其他配置
  "permissions": ["http://127.0.0.1:8000/*"]
}

修改完manifest后,记得重新加载扩展(Firefox扩展管理页→调试扩展→重新加载)。

2. 内容脚本上下文限制,改用后台脚本发起请求

Firefox的内容脚本运行在页面的隔离上下文里,虽然规范说支持XHR/Fetch,但实际场景中容易被浏览器的安全策略拦截。更可靠的方式是把请求逻辑放到**后台脚本(Background Script)**中,通过消息通信让内容脚本调用:

后台脚本(background.js)

// 监听内容脚本的消息
browser.runtime.onMessage.addListener((request, sender, sendResponse) => {
  if (request.type === 'fetchWord') {
    // 后台脚本拥有更高权限,跨域请求更稳定
    fetch(`http://127.0.0.1:8000/api/${request.word}/`)
      .then(res => res.json())
      .then(data => sendResponse({success: true, data}))
      .catch(err => sendResponse({success: false, error: err.message}));
    return true; // 保持消息通道开放,支持异步响应
  }
});

内容脚本(content.js)

function getWord(word) {
  // 向后台脚本发送请求
  browser.runtime.sendMessage({type: 'fetchWord', word}, (response) => {
    if (response.success) {
      console.log('请求成功:', response.data);
    } else {
      console.error('请求失败:', response.error);
    }
  });
}

别忘了在manifest里声明后台脚本:

  • V3:"background": {"service_worker": "background.js"}
  • V2:"background": {"scripts": ["background.js"]}

3. 检查Django服务器的绑定地址

有时候Django默认只绑定127.0.0.1,可能导致扩展上下文无法访问。试试启动服务器时绑定所有地址:

python manage.py runserver 0.0.0.0:8000

然后请求地址换成http://localhost:8000/api/${word}/再测试。

4. 临时排查:调整Firefox的CORS严格策略

这是临时调试方案,不建议长期使用:

  1. 在Firefox地址栏输入about:config,确认风险提示
  2. 搜索network.cors.preflight.strict_origin_policy,将其值设为false
  3. 重启浏览器后测试请求

先从权限配置开始排查,这是90%以上的情况会碰到的问题,不行再依次试后面的方案。

内容的提问来源于stack exchange,提问作者O.Chounry

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:05:08