iris框架不内置http响应缓存,需手动设置cache-control头;静态文件缓存硬编码为3600秒且不可配置,动态接口须每个handler显式添加缓存头,并注意etag校验与缓存失效管理。

Iris 框架本身不内置 HTTP 响应缓存(如 Cache-Control 头自动管理),它把控制权完全交给你——这意味着你得自己加头、自己决定缓存策略,而不是调用一个 EnableResponseCache() 就完事。
怎么手动设置 Cache-Control 响应头
Iris 的 Context 提供了直接操作响应头的能力,最常用也最可控的方式是调用 ctx.Header() 设置 Cache-Control。注意:它不会自动处理 ETag、Last-Modified 或条件请求(如 If-None-Match),那些要你自己实现或借助中间件。
-
ctx.Header("Cache-Control", "public, max-age=3600")表示该响应可被任何缓存(浏览器、CDN)存储 1 小时 -
ctx.Header("Cache-Control", "private, max-age=600")表示只允许用户浏览器缓存 10 分钟,CDN 不得缓存 -
ctx.Header("Cache-Control", "no-store")彻底禁用缓存(敏感数据场景必须用这个,no-cache≠ 不缓存) - 如果同时需要
Expires,建议只设Cache-Control,因为 HTTP/1.1 规范明确要求它优先级高于Expires
为什么不能依赖 Iris 自动缓存静态文件
Iris 的 app.StaticWeb() 或 app.StaticFile() 确实会默认加 Cache-Control: public, max-age=3600,但这是硬编码的 1 小时,且不可配置。如果你部署在 Nginx 或 Cloudflare 后面,这个头可能被覆盖或忽略;更关键的是,它对动态路由(比如 GET /api/user/:id)完全无效——这些必须手写逻辑。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 静态资源缓存行为由
StaticHandler内部控制,源码里写死为3600秒,没暴露配置项 - 动态接口若想复用相同缓存策略,必须每个 handler 都显式调用
ctx.Header(),没法全局统一注入 - 别指望
app.UseGlobal()中间件能安全加缓存头——它会在所有响应前执行,包括 404、500,容易导致错误响应也被缓存
如何安全地给 API 路由加缓存(带校验)
真正可靠的缓存需要配合 ETag 或 Last-Modified 实现条件请求,避免“过期后仍返回旧数据”。Iris 不提供开箱即用的 ETag 生成器,但你可以用标准库快速补足:
- 对确定性内容(如 JSON API 返回固定结构数据),用
fmt.Sprintf("%x", sha256.Sum256([]byte(respBody)))生成 ETag - 在 handler 开头检查
ctx.GetHeader("If-None-Match"),匹配则调用ctx.WriteHeader(304)并 return - 不要对含用户身份、权限逻辑的接口启用强缓存(比如
/me/profile),否则不同用户可能看到彼此缓存 - 如果用了 Redis 存响应体,记得缓存 key 必须包含 query 参数、Accept 头、用户角色等上下文,否则会混用
缓存最难的不是加头,而是失效时机——Iris 给你自由,也意味着你要为每个 PUT/DELETE 接口同步清理对应 GET 路径的 CDN 缓存或本地缓存,这点没人替你做。










