【问题标题】:nginx: Force browser to revalidatenginx:强制浏览器重新验证
【发布时间】:2017-07-12 17:30:48
【问题描述】:

下面是我的nginx 服务器配置。最近添加了 Cache-Control 标头。我的浏览器仍然缓存了旧文件并且没有从服务器获取它 - 我通过跟踪 access.log 来验证这一点。有没有办法强制所有用户从我的服务器获取更新的文件?

    location /webapp {
        root /usr/share/nginx/html;
        try_files $uri $uri/ /webapp/index.html;
        add_header  Cache-Control must-revalidate always;
    }

【问题讨论】:

    标签: nginx browser-cache cache-control


    【解决方案1】:

    一旦文件被缓存,你真的不能做太多的事情来使条目无效。

    用户通常必须发出强制重新加载,这通常可以通过按住 SHIFT 键同时按下 RELOAD 按钮来完成。

    或者,如果相关资源是从您仍然可以控制的网页中加载的,那么您通常可以添加随机字符串作为资源的参数(例如,将网页中的 .png 替换为 .png?v=$sha1 ),对于静态资源,nginx 通常会忽略它,但会确保资源具有新的 URL,因此还不能被缓存。 (同样的技巧,在 URL 中添加一个随机的 noop 参数,用户也可以使用它来有效地强制一个新的请求,而不管所涉及的资源是否已经被缓存。)

    【讨论】:

    • 我是这么认为的。即使我的 url 看起来像这样 https://host.com/webapp/unsubscribe/${hash1}/${hash2}?param=value Chrome 也不想从服务器获取新的 index.html。它显示请求为 200 OK,但 nginx 没有记录任何访问权限。
    • @AnshulKoka,只需在 URL 的末尾(?param=value 之后)添加一个额外的&20170714T1024PT,看看是否可以解决问题。如果不是,那么这不是浏览器缓存的问题,而是与浏览器无关的后端问题。
    • 刚刚做了,没有运气。 FWIW,hash 字段也总是唯一的,所以 URL 是唯一的,这让我感到困惑,因为除了旧的 index.html 试图加载和接收的 JS 资源之外,我仍然在 access.log 中看不到任何东西为它返回404。有没有办法捕获这个旧资源并强制浏览器重新加载而不是返回 404?
    • @AnshulKoka,那么这显然不是浏览器缓存问题,而且你是在找错树了!
    猜你喜欢
    • 2023-02-07
    • 2012-11-04
    • 2015-01-05
    • 2018-08-01
    • 2013-07-27
    • 2017-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多