我有一个提供图像的 webapp:
我清楚地Cache-Control
正确设置了标题,并且网络服务器正在设置Etag
.
问题是资源If-None-Match
每次都被有效地忽略Cache-Control
标题。(框架相应地返回 304,但存在往返)。
我读过Etag
标题可能会否决Cache-Control
,即使资源是本地且有效的,仍然会检查匹配项。这对我来说毫无意义。
有谁知道发生了什么?我在这里想念什么?
PD:Web 服务器是一个 Play!应用
我有一个提供图像的 webapp:
我清楚地Cache-Control
正确设置了标题,并且网络服务器正在设置Etag
.
问题是资源If-None-Match
每次都被有效地忽略Cache-Control
标题。(框架相应地返回 304,但存在往返)。
我读过Etag
标题可能会否决Cache-Control
,即使资源是本地且有效的,仍然会检查匹配项。这对我来说毫无意义。
有谁知道发生了什么?我在这里想念什么?
PD:Web 服务器是一个 Play!应用
终于明白了。当您使用 CMD+R 或 F5 重新加载页面时,某些浏览器(肯定是 Google Chrome 和 Firefox)会忽略本地缓存。
就我而言,无论我设置的 max-age 有多高,页面重新加载总是会强制If-None-Match
检查并返回 304。通过单击链接浏览网站不会触发此行为,并且缓存可以正常工作。
注意:我没有注意到这一点,因为在单页 web 应用程序(如我的)中没有“链接单击导航”,因为它们中的大多数都是在开始时加载的。
您可能会受到代理的攻击。
该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 个指令,并且我在测试中没有注意到异常行为。