直接在负载均衡层缓存options预检请求可显著减少后端无效穿透;需在nginx中显式配置proxy_cache_methods包含options,并设置proxy_cache_key含$http_origin以支持多源,配合proxy_cache_valid按状态码设定合理缓存时长。

直接在负载均衡层缓存 OPTIONS 预检请求,能显著减少对后端服务的无效穿透,尤其在高频跨域场景下效果明显。关键不是“能不能缓”,而是“怎么让 Nginx 把 OPTIONS 当作可缓存响应来处理”——默认它不会缓。
确保 OPTIONS 响应被识别为可缓存
Nginx 的 proxy_cache 默认只缓存 GET 和 HEAD 方法,OPTIONS 不在默认列表中。必须显式启用:
- 在
http或location块中添加:proxy_cache_methods GET HEAD POST OPTIONS; - 若只针对预检请求缓存,可单独为 OPTIONS 设置缓存指令(配合 if 判断),但更推荐统一开启方法类型,便于后续扩展
为 OPTIONS 响应配置独立的缓存有效期
预检响应通常不含业务数据,但携带 CORS 头(如 Access-Control-Allow-Methods),适合长期缓存。建议按状态码区分设置:
-
proxy_cache_valid 204 86400;—— 大多数预检返回 204 No Content,缓存 1 天 -
proxy_cache_valid 200 302 3600;—— 少数服务返回 200,缓存 1 小时已足够 - 避免对 4xx/5xx 缓存,除非你明确需要兜底行为
构造稳定、无歧义的缓存键
OPTIONS 请求通常无 body、参数少,但 Origin 和请求路径是关键维度。使用以下键可避免不同源或路径冲突:
proxy_cache_key "$scheme$request_method$host$uri$is_args$args$http_origin";- 加入
$http_origin可支持多源场景下的精准缓存(注意:若后端动态校验 Origin,此键需与之匹配) - 不建议用
$request_uri(含原始编码),$uri$is_args$args更规范
在 location 中启用并验证缓存生效
以 API 路径为例,在对应 location /api/ 块中整合配置:
- 启用缓存区:
proxy_cache my_backend_cache; - 允许缓存 OPTIONS:
proxy_cache_methods GET HEAD POST OPTIONS; - 设定键和过期策略(见上两条)
- 添加调试头:
add_header X-Cache-Status $upstream_cache_status;,用 curl 测试 OPTIONS 请求,观察响应头是否出现HIT











