3

我有一个提供图像的 webapp:

在此处输入图像描述

我清楚地Cache-Control正确设置了标题,并且网络服务器正在设置Etag.

问题是资源If-None-Match每次都被有效地忽略Cache-Control标题。(框架相应地返回 304,但存在往返)。

我读过Etag标题可能会否决Cache-Control,即使资源是本地且有效的,仍然会检查匹配项。这对我来说毫无意义。

有谁知道发生了什么?我在这里想念什么?

PD:Web 服务器是一个 Play!应用

4

2 回答 2

3

终于明白了。当您使用 CMD+R 或 F5 重新加载页面时,某些浏览器(肯定是 Google Chrome 和 Firefox)会忽略本地缓存。

就我而言,无论我设置的 max-age 有多高,页面重新加载总是会强制If-None-Match检查并返回 304。通过单击链接浏览网站不会触发此行为,并且缓存可以正常工作。

注意:我没有注意到这一点,因为在单页 web 应用程序(如我的)中没有“链接单击导航”,因为它们中的大多数都是在开始时加载的。

于 2014-10-21T23:14:54.953 回答
2

您可能会受到代理的攻击。

max-age指令适用于浏览器,而该s-maxage指令适用于代理。

您似乎在 Cache-Control 标头中缺少 s-maxage 指令。

您可能还想添加public指令。(即使根据规范这应该是默认值,明确设置它也没有什么坏处)

http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.3

另外,请记住,一些代理很可能会选择忽略所有这些,因此即使您已经完美地配置了所有内容,您也不会完全停止接收请求。

我在为 CDN 提供图像(也使用 ETag 和 Last-Modified)的服务中设置了所有 3 个指令,并且我在测试中没有注意到异常行为。

于 2014-10-21T16:26:42.930 回答