为什么浏览器不尊重缓存标头用于初始页面请求?


8

我对此有点挠头。我运行的一个Drupal网站正在设置适当的缓存头,这些缓存头应指示该页面可以缓存15分钟。但是,每次我访问该页面时,它总是发送GET请求,而不是从缓存中加载该页面。

我并不是每次都强制刷新页面,我认为这将向浏览器指示我要刷新缓存。我没有启用任何开发人员模式缓存清除功能。

这仅仅是浏览器的默认行为,还是我遗漏了一些明显的东西?这是从FireFox开发工具访问我的主页时的请求/响应标头:

注意/编辑:有人建议这与Expires过去的标题有关。但是,如RFC 2616 Sec 14.9.3中所述,Cache-Control优先于中的任何内容。Drupal包括此功能以禁用较旧的HTTP 1.0客户端上的缓存,该客户端不支持Drupal进行适当缓存所需的更高级的标头。ExpiresVary

在此处输入图片说明

Answers:


11

您在响应中有一个Vary:Cookie,Accept-Encoding标头。这几乎意味着,如果代理(包括您的浏览器)想要缓存此页面,则应该准备为每个可能修改的cookie vlaue(或接受编码的更改)缓存一个新版本。特别是,必须将cookie作为请求的区分标准在请求中发送时保留在cookie的第一位。我可以想象,如果cookie太大(因此不太可能重复),浏览器就会拒绝它,或者我拒绝它是为了避免cookie信息通过缓存内容泄漏,或者只是cookie内容在每次更改时都被拒绝。呼叫。


4
我刚刚得出这个结论时也正要回答我自己的问题。我有Google Analytics(分析)cookie,其中每个页面请求都会更改其中之一,从而阻止了页面的缓存。
布莱恩

2

在CMS程序中,某些页面需要与数据库交互以显示特定于用户请求的动态内容。整个页面无法缓存,或者不会向用户显示正确的内容。

实际上,电子商务的购物车/结帐页面就是一个例子。由于页面每次看起来都不同,因此无法完全缓存它。在不了解特定页面的情况下,很难知道您所引用的页面是否需要数据库的参与。


虽然这是事实,但对于Drupal的页面缓存机制(它确实缓存整个HTML输出并将其提供给“匿名”流量)而言,并非如此,并且与我的问题无关。我的问题是关于浏览器似乎对设置的相应页面缓存标头有何不正确的反应(请参见图片)。
布莱恩2014年

我之前在调试过程中就已经看到了这一点,但记不清了,您的响应标头显示的有效期限是否为Expires:1978年11月?或这可能是您的答案。
JMC 2014年

1
在Drupal的代码中,标头上方的注释如下:“ HTTP / 1.0代理不支持Vary标头,因此,通过发送过去的Expires日期来防止任何缓存。如果使用Cache-Control,HTTP / 1.1客户端将忽略Expires标头:指定了max-age =指令(请参阅RFC 2616,第14.9.3节)。” 具体日期是Drupal生日的创建者。
布莱恩(Brian)

仍然奇怪的是,到期日不匹配,例如最后修改时间加上最大年龄
哈根·冯·埃岑

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.