nginx缓存需与路由逻辑对齐:用锚定正则精准匹配路径,定制cache_key剔除敏感参数,按响应特征差异化设置缓存策略,并尊重上游cache-control头实现柔性控制。

要让 Nginx 缓存真正适配复杂 URL 路由,关键不是简单加个 proxy_cache,而是把缓存行为和路由逻辑对齐——比如区分带参/不带参、带版本号/不带版本号、含用户标识或不含标识的请求。否则容易出现缓存污染、命中率低、甚至返回错误内容。
精准匹配目标路径,避免误缓存
用 location 匹配复杂路由时,优先使用锚定正则而非前缀匹配,防止子路径被意外包含。
-
推荐写法(严格限定):
location ~ ^/(api/v1/users|v2/orders)/?$—— 只缓存根级路径,结尾/?允许可选斜杠 -
慎用写法:
location /api/—— 会匹配所有子路径(如/api/v1/users/export),若该路径是导出接口就不该缓存 - 对含版本号的 API(如
/v1.2.0/status),可用location ~ ^/v[0-9]+\.[0-9]+\.[0-9]+/status$精确捕获
定制缓存键,让语义一致的请求共享缓存
默认 $uri?$args 会让 /users?id=123 和 /users?id=456 存成两个缓存项,但实际业务中可能只需按路径缓存(如只读列表页)。
当代理已经知道网站路由或内容URL,并且在启动前需要有效的sitemap XML、sitemap索引或robots.txt引用时,请使用sitemap。这是一个发布构件技能,而不是爬虫或SEO平台。
- 统一去参:在对应 location 中设
proxy_cache_key "$scheme$request_method$host$uri"; - 保留关键参数:若需按分页缓存,可写
proxy_cache_key "$scheme$request_method$host$uri$is_args$page";(前提是$page已通过set $page $arg_page;提取) - 排除敏感字段:含
token、session_id的参数应从 key 中剔除,避免每个用户生成独立缓存
按响应特征控制缓存策略
复杂路由常对应不同业务含义,缓存时间、是否缓存、是否允许 stale 都应差异化设置。
-
/healthz或/status类探针接口:缓存 10 秒,加proxy_cache_use_stale error timeout updating;,确保后端短暂不可用时仍能返回旧状态 -
/api/v1/products(商品列表):缓存 5 分钟,状态码仅200有效,404也缓存 1 分钟防刷 -
/api/v1/user/me(当前用户信息):禁用缓存,加proxy_ignore_headers Cache-Control Set-Cookie;并显式设proxy_cache_valid any 0s;
配合上游响应头做柔性控制
后端可通过 Cache-Control 头动态干预 Nginx 缓存行为,比硬编码更灵活。
- 后端返回
Cache-Control: public, max-age=300→ Nginx 尊重该值,覆盖proxy_cache_valid - 后端返回
Cache-Control: private, no-store→ 默认不缓存,需加proxy_ignore_headers Cache-Control;才强制缓存 - 用
add_header X-Cache-Status $upstream_cache_status;暴露命中状态,便于前端或监控识别










