django - (Django, Nginx) 防止客户端浏览器缓存静态文件?
问题描述
我的网站使用 Django、Gunicorn 和 Ngnix。我试图让访问我的网站的客户端浏览器始终获取最新的静态文件,而无需按 Ctrl+F5 清除浏览器缓存以获取新的静态文件。
我在很多地方找到了类似于以下的答案:
- 修改文件 /etc/ngnix/sites-enabled。
- $须藤纳米我的网站。
- 在服务器块中添加以下代码。
location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
expires -1;
}
唯一发生的事情是静态文件根本不加载,或者它们确实加载了,但浏览器仍在缓存它们,需要通过 ctrl+F5 手动清除它们。
如何让浏览器每次都获取新的静态文件?
解决方案
尝试以下 nginx 配置来指示浏览器不要缓存静态文件。
location / {
add_header Cache-Control "no-store, no-cache, private";
}
无店
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
我的参考资料:
推荐阅读
- android - 禁用缩放底部导航菜单android studio的活动项目
- mysql - 筛选选择是否比获取所有行然后筛选更快
- postgresql - 使用 express.js 时无法将新查询插入 Postgres 数据库
- javascript - 填写对象数组以添加 0 个值
- activecollab - 如何在 ActiveCollab 中通过 API 发送发票?
- linux - Flutter:AdbConnectionClientInfo 缺少可配置的必填字段
- node.js - Swift Alamofire 在 cookie 中设置用户对象
- activerecord - 如何访问 has_many 关联的 ActiveRecord 身份
- flutter - 在 Flutter 中使用 post 方法上传图片
- css - Material-Ui:日期选择器到 Grid-Component 内部的 100% 宽度