【问题标题】:(Django, Nginx) Prevent client browsers from caching static files?(Django, Nginx) 防止客户端浏览器缓存静态文件?
【发布时间】:2019-07-12 08:56:02
【问题描述】:

我的网站使用 Django、Gunicorn 和 Ngnix。我正在尝试让访问我网站的客户端浏览器始终获取最新的静态文件,而无需按 Ctrl+F5 清除浏览器缓存以获取新的静态文件。

我在很多地方都找到了类似以下的答案:

  1. 修改文件 /etc/ngnix/sites-enabled。
  2. $Sudo Nano 我的网站。
  3. 在服务器块中添加以下代码。
location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
    expires -1;
}

唯一发生的情况是静态文件根本不加载,或者它们确实加载了,但浏览器仍在缓存它们,需要通过 ctrl+F5 手动清除它们。

如何让浏览器每次都获取新的静态文件?

【问题讨论】:

    标签: django nginx caching static


    【解决方案1】:

    尝试以下 nginx 配置来指示浏览器不要缓存静态文件。

    location / {
      add_header Cache-Control "no-store, no-cache, private";
    }
    

    As per HTTP1.1 Specifications

    无商店

    no-store 指令的目的是防止无意中 发布或保留敏感信息(例如,在备份时 磁带)。 no-store 指令适用于整个消息,并且可以 在响应或请求中发送。如果在请求中发送,则 缓存不得存储此请求或任何响应的任何部分 给它。如果在响应中发送,缓存不能存储任何部分 此响应或引发它的请求。该指令 适用于非共享和共享缓存。 “不得存储”在 这个上下文意味着缓存不能故意存储 非易失性存储中的信息,并且必须尽最大努力 尝试尽快从易失性存储中删除信息 转发后即可。即使与此指令相关联 有了响应,用户可能会明确地将这样的响应存储在外部 缓存系统(例如,使用“另存为”对话框)。历史缓冲区 可以将此类响应存储为正常操作的一部分。

    本指令的目的是满足规定的要求 某些担心意外的用户和服务作者 通过对缓存数据的意外访问释放信息 结构。虽然使用该指令可能会改善隐私 在某些情况下,我们警告说它绝不是可靠的或 保障隐私的充分机制。特别是恶意或 受损的缓存可能无法识别或遵守此指令,并且 通信网络可能容易被窃听。


    但是,我建议使用ManifestStaticFilesStorage 而不是不在浏览器上缓存静态文件。这会将文件内容的 md5 哈希附加到文件名。因此,每次更改文件内容时,文件名都会更改,浏览器将对文件发出新请求。这样,浏览器可以将静态文件缓存更长时间,提高页面加载性能。

    要启用 ManifestStaticFilesStorage,您必须确保满足以下要求:

    • STATICFILES_STORAGE 设置设置为 django.contrib.staticfiles.storage.ManifestStaticFilesStorage
    • DEBUG 设置为 False
    • 您已使用collectstatic 管理命令收集了所有静态文件

    # in settings.py
    STATICFILES_STORAGE = 'django.contrib.staticfiles.storage.ManifestStaticFilesStorage'
    DEBUG = False
    

    运行

    python manage.py collectstatic
    

    我的参考资料:

    【讨论】:

      猜你喜欢
      • 2015-02-14
      • 2019-01-02
      • 2017-02-06
      • 1970-01-01
      • 2019-09-21
      • 1970-01-01
      • 2017-02-04
      • 2013-12-10
      • 2020-08-03
      相关资源
      最近更新 更多