(Django,nginx)防止客户端浏览器缓存静态文件



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

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

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

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

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

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

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

按照http1.1规格

无存储

无商店指令的目的是防止无意 释放或保留敏感信息(例如,备份时 磁带)。无存储指令适用于整个消息,可能 在响应或请求中发送。如果在请求中发送, 缓存不得存储此请求或任何响应的任何部分 对此。如果在响应中发送,缓存不得存储 该响应或引起它的请求。这个指令 适用于非共享和共享缓存。"不能存储" 此上下文意味着缓存不得故意存储 非易失性存储中的信息,必须做出最好的富裕 尝试尽快从挥发性存储中删除信息 转发后可能。即使该指令相关联 通过响应,用户可能会明确存储这样的响应 缓存系统(例如,带有"保存为"对话框)。历史缓冲区 可以存储此类响应作为其正常操作的一部分。

该指令的目的是满足 某些担心偶然的用户和服务作者 通过意外访问缓存数据发布信息 结构。虽然该指令的使用可能会改善 在某些情况下,我们警告说,这绝不是可靠的或 足够的机制来确保隐私。特别是恶意或 受损的缓存可能无法承认或遵守该指令,并且 通信网络可能很容易窃听。


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

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

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

即。

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

运行

python manage.py collectstatic

我的参考文献:

  • https://www.w3.org/protocols/rfc2616/rfc2616-sec14.html#sec14.9.2
  • https://www.keycdn.com/blog/http-cache-headers
  • https://docs.djangoproject.com/en/2.1/ref/contrib/staticfiles/#django.contrib.contrib.staticfiles.storage.manifeststaticfilesstorage

相关内容

最新更新