Fiber 的 c.Static() 默认不强缓存,因其不自动设置 Cache-Control 头,浏览器按默认策略处理;需手动配置头或改用 c.StaticFile() 配合 ETag 实现可靠强缓存。

为什么 Fiber 的 c.Static() 默认不强缓存
Fiber 的 c.Static() 和 c.StaticFile() 不是“自动强缓存”的开关,它只负责文件读取和响应,Cache-Control 头默认为空。浏览器看到没缓存头,就按自己策略处理(通常是 no-cache 或协商缓存),根本不会长期存。你看到 JS/CSS 每次重刷都拉新,不是路径错了,是压根没告诉浏览器“这个文件一年内别动”。
用 c.StaticFile() 配合 ETag 实现可靠强缓存
c.StaticFile() 是目前 Fiber 中最接近“开箱即用强缓存”的方式——它会自动设置 Content-Type、Last-Modified 和基于文件 mtime 的 ETag,只要你在 handler 里显式调用它,并确保文件路径稳定。
- 写法必须是
c.StaticFile("/", "./dist/index.html"),第一个参数是请求路径/,不是/index.html;否则 ETag 不生效 - 它只对单个文件生效,不能用于目录(如
/static/);目录级缓存得用c.Static()+ 手动加头 - 确保构建产物带哈希(如
app.a1b2c3.js),否则强缓存下用户永远收不到更新 - 不要在开发期用它配
max-age=31536000,浏览器可能卡死在旧版,改用no-cache或max-age=0
对 /static/ 目录手动加 Cache-Control 头
c.Static("/static", "./dist/static") 本身不设缓存头,必须包一层自定义 handler 才能控制行为。Fiber 没有内置中间件帮你干这事,得自己写。
使用 uber-go/dig 在 Golang 中实现依赖注入——基于反射容器,提供 Provide/Invoke、dig.In/dig.Out 参数与结果对象,支持命名依赖等
- 注册时别直接传
http.Dir,改用http.FileServer包装后的 handler: - 在 handler 内部调用
c.Set("Cache-Control", "public, max-age=31536000, immutable")(注意immutable能避免某些浏览器的条件请求) - 对不同扩展名区别对待:JS/CSS/woff2 用 year 级缓存;HTML/ico 用
no-cache或max-age=0 - 路径拼接必须用
filepath.Join,Windows 下"./dist\static"会导致静默 404
真正要强缓存,别让 Go 服务管静态文件
哪怕你把 Cache-Control、ETag、gzip 全配齐,Go 进程仍要承担文件读取、内存拷贝、HTTP 编码等开销。CDN 或对象存储(S3/OSS/R2)才是为静态资源设计的——它们天生支持边缘缓存、Brotli、HTTP/3、自动 ETag 和秒级全球分发。
立即学习“go语言免费学习笔记(深入)”;
- Go 只需把 HTML 中的
/static/app.js替成https://cdn.example.com/app.a1b2c3.js - 构建时生成哈希文件名,而非靠查询参数(
?v=1.2.0多数 CDN 忽略) - 禁用 Go 层对
/static/的路由,彻底交由 CDN 回源或 404,减少 Go 进程压力 - 如果必须走 Go(比如权限校验),那就用
http.ServeContent替代http.FileServer,启用零拷贝

















