Golang Gin Static 缓存大坑:embed 文件无法被 CDN 和浏览器缓存

💡 原文中文,约5300字,阅读约需13分钟。
📝

内容提要

Golang 的静态文件嵌入功能简化了部署,但在使用 Gin 框架时,静态文件的缓存响应头处理不当,导致每次都需重新下载。解决方案是使用 Nginx 提供静态文件服务,以避免复杂的 ETag 计算。

🎯

关键要点

  • Golang 的静态文件嵌入功能简化了部署,只需一个可执行文件。
  • 使用 Gin 框架时,静态文件的缓存响应头处理不当,导致每次都需重新下载。
  • 阿里云 ESA 没有缓存静态资源文件,需要回源站请求。
  • 浏览器每次重新下载静态资源文件,导致页面空白。
  • Golang Gin 的 Static 方法无法正确处理 HTTP 缓存响应头。
  • 其他框架(如 PHP Laravel)使用 Nginx 提供服务时没有此问题。
  • 嵌入的文件缺少本地时间戳,导致无法计算 ETag。
  • Nginx 的 ETag 计算方法基于文件最后修改时间和内容长度。
  • 建议使用 Nginx 提供静态文件服务,避免复杂的 ETag 计算。
  • 开发环境使用 Static 非 embed 的方式调试,生产环境使用 Nginx。
➡️

继续阅读