“一般来说不应该在后端(业务服务器)里返回 CORS 头” 是更主流、更省心的做法,理由有三点:
职责单一
业务服务器只关心业务逻辑;网关 / CDN / 反向代理层统一处理跨域、鉴权、限流、缓存等横切关注点。
避免重复
如果业务服务器已经返回了 Access-Control-Allow-Origin: *
,而 CDN 又加一次,就会出现你现在看到的“双份”问题。把 CORS 集中到网关/CDN 后,只需在网关层配置一次,业务服务器完全不用关心。
方便运维
域名、端口、证书、CORS 策略等经常变动,放在网关层改一条规则即可,不需要重新部署所有业务服务。
典型做法
- Nginx / OpenResty / Kong / Envoy / Traefik 等网关层统一加 CORS 头。
- Cloudflare / AWS CloudFront / Azure Front Door / 阿里云 CDN 等边缘 CDN 用 Transform Rules、Edge Functions 或 Page Rules 统一加。
- 业务服务器返回的响应里 不携带任何 CORS 头(或者只在开发环境携带,生产环境由网关覆盖)。
例外场景
- 内网微服务之间调用,不走公网,不需要 CORS。
- 某些私有化部署场景,没有统一网关,只能业务服务器自己加。
结论
除非有特殊限制,推荐把 CORS 头放在网关或 CDN 层,业务服务器保持干净。