(Django,Nginx)阻止客户端浏览器缓存静态文件?

问题描述 投票:0回答:1

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

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

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

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

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

django nginx caching static
1个回答
2
投票

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

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

As per HTTP1.1 Specifications

取S1上

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

我的推荐:

© www.soinside.com 2019 - 2024. All rights reserved.