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

时间:2019-02-18 22:32:44

标签: django nginx caching static

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

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

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

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

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

1 个答案:

答案 0 :(得分:2)

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

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

As per HTTP1.1 Specifications

无商店

  

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

     

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


但是,我建议使用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

我的参考资料: