导航回来时将网站缓存到浏览器

时间:2017-01-31 21:41:54

标签: django http nginx

我的网站有一个网址,我希望将其缓存到浏览器中,因此每当用户离开该网页,然后按下浏览器的“返回”按钮时,我就不希望这样请求转到django,但提供浏览器中页面的缓存版本。此外,我无法在Web服务器和Django之间使用缓存页面的解决方案,因为每个用户对他们可以看到的数据拥有不同的权限。 所以我在我的nginx配置中添加了这个:

...
location /search {
    expires 300s;
    add_header Cache-Control "private";
...

这很有效,50%的时间:)。我怎么能让它一直工作?

1 个答案:

答案 0 :(得分:1)

  

每当用户离开该页面,然后按下浏览器的BACK按钮时,我根本不希望该请求转到django,而是提供浏览器中页面的缓存版本< / p>

对于某些浏览器,这是默认行为 - 如果您在服务器上没有设置缓存指令,那么它不仅会保留响应的副本,还会保留内存中的整个呈现页面,而不是单击后退按钮,它可以立即显示。

但是如果要显式指示浏览器缓存响应,可以在Cache-Control标头上使用max-age指令。设置

Cache-Control: max-age=3600

这比使用“Expires”标题更加现代和可靠,特别是对于小持续时间。如果用户的浏览器设置了错误的时间或时区,则“过期”可能根本不起作用,但“max-age”仍然应该。

如果您为每个人提供不同版本的页面,您也可以添加“私有”以防止代理缓存(如您的示例所示):

Cache-Control: private; max-age=3600

注意:您无法强制浏览器始终使用缓存。如果您注意到有时它不使用缓存,则可能是:

  • 缓存中的项目已过期。您只给了它5分钟,所以在进入缓存的请求后5分钟,如果再次请求它,它将通过请求发送到远程服务器 - 即使在时间之间有请求。

  • 浏览器缓存已满,部分项目已清除。

  • 由于某种原因,浏览器认为或被配置为认为不管缓存指令如何都不应缓存响应。

  • 用户按下了重新加载。

  • 客户端和服务器之间的代理剥离了Cache-Control或其他标头。