必须在 proxy_cache_key 中包含 $http_origin 并添加 add_header vary "origin";,以防止跨域缓存污染;同时保留 cors 响应头、区分 options 预检缓存,确保各源响应隔离且合规。

要让 Nginx 的 proxy_cache 正确缓存跨域(CORS)请求的响应数据,关键不是“支持跨域”,而是避免缓存污染和安全错配——因为不同源(Origin)的请求若共用一个缓存项,可能把 A 站的 Access-Control-Allow-Origin: A.com 错返回给 B 站,导致浏览器拒绝响应。
必须在缓存键中包含 Origin 信息
默认缓存键不识别请求头,跨域场景下极易复用错误响应。需显式将客户端来源纳入缓存区分维度:
- 在
location块中设置:proxy_cache_key "$scheme$request_method$host$request_uri$http_origin"; - 若后端根据
Origin动态生成 CORS 头(如白名单匹配),该配置能确保每个合法源都有独立缓存项 - 若允许所有源(
Access-Control-Allow-Origin: *),且无凭据(credentials: 'include'未启用),可省略$http_origin,但生产环境不建议这样简化
显式添加 Vary 响应头
告诉下游(包括浏览器和中间代理):该响应内容随 Origin 变化,不可混用:
FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。
add_header Vary "Origin";- 这与
proxy_cache_key配合,是 HTTP 缓存规范要求的双重保障 - 注意:Nginx 不会自动加 Vary,必须手动配置,否则即使 key 区分了 origin,CDN 或浏览器仍可能误判可复用
保留并透传 CORS 相关响应头
Nginx 默认可能忽略或覆盖某些响应头,需主动声明保留:
-
proxy_ignore_headers Cache-Control Expires Set-Cookie;(防止后端禁用缓存的头干扰) -
add_header Access-Control-Allow-Origin "$http_origin";(动态回写,配合白名单逻辑更安全) - 或固定值:
add_header Access-Control-Allow-Origin "*";(仅限无 credentials 场景) - 同时补全其他必要头:
Access-Control-Allow-Methods、Access-Control-Allow-Headers、Access-Control-Allow-Credentials(按需)
为 OPTIONS 预检请求单独优化
跨域预检高频、无业务负载,非常适合缓存:
- 在
http块中启用:proxy_cache_methods GET HEAD OPTIONS; - 在对应
location中设置:proxy_cache_valid 204 1h;(OPTIONS 常返回 204) - 缓存键建议含 origin:
proxy_cache_key "$scheme$request_method$host$uri$http_origin"; - 响应头只需 CORS 相关,无需业务内容,轻量高效










