【发布时间】:2017-03-23 06:27:09
【问题描述】:
我向我的应用程序添加了自定义缓存行为,类似于 Thierry 建议的 in this article。对于静态内容中的每个 CSS、JS 和 HTML 文件服务器,我添加了以下两个标题:
// Added by me
ETag: "0c635aa7113262fac7606da2432e00f5" // md5(last_mod_date_of_file)
Cache-Control: max-age=31536000 // one year
// Automatically added by Restlet (probably Directory class?)
Date: Wed, 09 Nov 2016 11:50:53 GMT
Expires: Wed, 09 Nov 2016 12:00:53 GMT
Last-Modified: Wed, 09 Nov 2016 17:30:56 GMT
这很好,但是我注意到在测试服务器上部署代码并在 Chrome 中点击 F5 后,我再次获取整个响应主体(返回 HTTP 200)。
我注意到这些请求也使用了正确的标头:
Cache-Control:max-age=0
If-Modified-Since: Wed, 09 Nov 2016 17:30:56 GMT
If-None-Match: "0c635aa7113262fac7606da2432e00f5"
我的问题是,我是否应该在我的服务器过滤器中手动验证 If-None-Match 标头并返回 304 响应?还是由 Restlet 处理?
注意:这个问题有点奇怪的是它似乎在我的本地开发环境中正常工作。对于为什么 Expires 被 Restlet 设置为 before Last-Modified 的日期,我也有点困惑。如果这是邪恶的根源,我会尝试调试,但这不会使我关于手动设置 304 状态和检查服务器上的 ETag 的问题无效。
【问题讨论】:
-
一个典型的场景是在浏览器和 Java 应用程序之间有一个缓存反向代理。在这种情况下,304 由它处理,您无需在应用程序内部打扰。请小心,因为边缘服务器可能会解释与浏览器或 HTTP 标准定义不同的标头。例如。 NGINX 是高度可配置的。
-
从上面的标题中,Last-Expires 是当前时间之后的 10 分钟。实际上最后修改的时间接缝是错误的。也许构建和生产的时间或区域不同?
标签: java caching restlet etag restlet-2.3.1