V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
FaiChou
V2EX  ›  程序员

Nextjs build 之后首页的 header 有 s-maxage: 31536000 字段的疑惑

  •  
  •   FaiChou ·
    FaiChou · 13 天前 · 1342 次点击

    s-maxage 字段会让缓存服务器进行缓存处理,31536000 会让缓存服务器缓存 1 年。

    如果将 nextjs 部署在服务器上,使用 nginx 转发之后,如果 nginx 开了缓存。那么 1 年后会过期。

    并且是首页信息,不仅仅是静态资源。

    这样会有一个问题,没有办法发布新版本了,因为请求都被缓存命中。除非手动清楚缓存。

    我昨天还以为是 cloudflare cdn 的缓存,清理后也没有效果。最后才发现是 nigix 的缓存。

    10 条回复    2025-04-12 21:29:56 +08:00
    fuzzsh
        1
    fuzzsh  
       13 天前   ❤️ 1
    https://nextjs.org/docs/app/api-reference/config/next-config-js/headers#cache-control

    为什么不觉得是 Nextjs 问题🐕

    前端不是 SSR 结构直接 build 出来 html 多省事,多跑个服务徒增卸锅难度
    FaiChou
        2
    FaiChou  
    OP
       13 天前
    @fuzzsh
    不确定咱俩讨论的是不是同一个问题。我说的问题是**首页**也有这个 cache 字段,而不仅仅是静态资源。静态资源比如 js 或者 css 文件这样缓存没问题,但是首页这样缓存就危险了。如果 Nginx 有缓存,那么下次发版,必须清空缓存才能刷新出来新版本。

    FaiChou
        3
    FaiChou  
    OP
       13 天前
    @fuzzsh 有一点奇怪,build 之后自己跑 npm start ,会有这个 `s-maxage: 31536000` 缓存头。但是部署到 vercel 自己的服务上,就没有这个 `s-maxage: 31536000` 头。

    只能说 vercel 自己的服务器处理过这个请求头。

    所以自己要用 Nginx 转发 nextjs 这个服务的话,也需要把这个 s-maxage 头给抹掉。
    zed1018
        4
    zed1018  
       13 天前
    我看了下我这 self-host 的 nextjs 项目,首页也有这个头。但是实际上并不影响发版。因为缓存并不是一个头控制的,比如 Etag 等,都会控制或者无效化缓存。
    fuzzsh
        5
    fuzzsh  
       13 天前
    https://nextjs.org/docs/app/building-your-application/caching
    你看下缓存机制就懂了

    不动代码也可以在 nginx 去掉这个 cache-control ,不让 client-side 缓存
    FaiChou
        6
    FaiChou  
    OP
       13 天前
    @fuzzsh #5 这个 s-maxage 缓存是让 proxy/cdn 的缓存策略,和 client-side 没关系。你没懂题目意思。

    https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Cache-Control

    > The s-maxage response directive indicates how long the response remains fresh in a shared cache. The s-maxage directive is ignored by private caches, and overrides the value specified by the max-age directive or the Expires header for shared caches, if they are present.
    FaiChou
        7
    FaiChou  
    OP
       13 天前
    @fuzzsh #5 “不动代码也可以在 nginx 去掉这个 cache-control ,不让 client-side 缓存”,是的,我在 3L 的回复中也说了,要在 nginx 中手动去掉这个 cache-control 请求头。
    FaiChou
        8
    FaiChou  
    OP
       13 天前
    @zed1018 ETag 或者 max-age 过期了只是客户端会重新去服务器重新获取新资源,但是服务器可能是 cdn 服务器,这些 cdn 上面也有缓存,s-maxage 是控制这些 cdn 服务器上缓存过期的功能。所以 cdn 服务器本身还是会返回老数据(缓存没过期)。
    zed1018
        9
    zed1018  
       13 天前
    @FaiChou #8 https://developers.cloudflare.com/cache/reference/etag-headers/
    这取决于 CDN ,有的 CDN 是支持 Etag 去 validate 资源的
    cs3230524
        10
    cs3230524  
       13 天前
    我前几天也遇到了,找了半天问题。只能不让容器缓存,去掉 nginx 相关代码。保留客户端让浏览器自己处理缓存。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2650 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 06:09 · PVG 14:09 · LAX 23:09 · JFK 02:09
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.