Chrome扩展请求服务器遇CORS拦截,配置Express CORS仍无效,问题出在哪?
你遇到的错误提示:
Access to fetch at (server-website) from origin 'chrome-extension://abc' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. If an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled
即使已配置CORS中间件仍报错,核心原因是服务器响应未正确返回允许扩展源的头信息,可能的问题点如下:
扩展ID不匹配
配置里的chrome-extension://abc必须和Chrome扩展的真实ID完全一致。确认方法:打开Chrome扩展管理页面,开启「开发者模式」,复制已安装扩展的完整ID,替换配置中的abc,确保无拼写错误。CORS中间件加载顺序错误
要保证cors中间件在所有路由定义和其他中间件(如express.static)之前加载。你当前将两个中间件放在同一个app.use中,若后续路由定义在该语句之前,这些路由不会应用CORS配置。建议拆分写法:var cors = require("cors"); var corsOptions = { origin: [ "server-url", "chrome-extension://你的真实扩展ID", ], }; // 先加载CORS中间件 app.use(cors(corsOptions)); // 再加载静态资源中间件 app.use(express.static(path.join(__dirname, "public")));CORS配置未实际生效
用curl发送预检请求验证服务器响应:curl -X OPTIONS -H "Origin: chrome-extension://你的真实扩展ID" https://你的服务器地址/目标接口 -I查看响应头是否包含
Access-Control-Allow-Origin: chrome-extension://你的真实扩展ID。若没有,说明CORS中间件未作用到请求上,检查是否有其他中间件(如路由拦截)提前处理了请求。反向代理覆盖响应头
如果Express服务器前有Nginx等反向代理,代理可能会覆盖或删除CORS响应头。需在代理配置中添加允许传递CORS头的设置,或直接在代理层配置CORS规则。
内容的提问来源于stack exchange,提问作者Ashley

