首页 > 解决方案 > (Django, Nginx) 防止客户端浏览器缓存静态文件?

问题描述

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

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

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

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

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

标签: djangonginxcachingstatic

解决方案


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

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

根据 HTTP1.1 规范

无店

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

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


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

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

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

IE

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

python manage.py collectstatic

我的参考资料:


推荐阅读