【发布时间】:2014-03-05 15:05:10
【问题描述】:
我正在开发一个 Web 应用程序,用于管理、存储和调整大量图像。
图像的请求类似于: 域:端口/image_id/大小
服务器获取 image_id,如果还没有这样大小的图像,它会创建它并将其存储在文件系统中。
所以一切正常,服务器正在运行,但我需要在浏览器中缓存这些图像至少一天,以减少服务器带宽消耗。
我做了几次测试,但似乎没有任何效果。
这是我用来制作响应头的代码:
response.writeHead(304, {
"Pragma": "public",
"Cache-Control": "max-age=86400",
"Expires": new Date(Date.now() + 86400000).toUTCString(),
"Content-Type": contentType});
response.write(data);
response.end();
我也尝试了响应状态 200。 contentType 始终是 mime 类型,例如“image/jpg”或“image/png” data 是图像的字节缓冲区。
有什么建议吗? 非常感谢。
长寿,繁荣,
d.
【问题讨论】:
-
RFC2616 10.3.5:如果客户端执行了条件 GET 请求并且允许访问,但文档没有被修改,服务器应该使用这个状态码响应。 304 响应不得包含消息体 [...]。您是否使用 If-Modified-Since/If-None-Match 发送 304 以响应 GET?为什么你
response.write(data)304 说“你不需要再次检索,使用以前获取的数据”? -
你是对的。使用 304 我得到第一个请求,而第二个,正如你所指出的,返回一个空的主体。这只是一个测试,我也使用了代码 200。我无法以任何方式将图像存储在浏览器缓存中
-
我不知道“工作”是什么意思,或者您所说的“第一”和“第二”请求是什么。但是实际阅读手册并保持保守永远不会受到伤害。我将忽略问题中损坏的 304 并假设为 200,其余代码完好无损。 tools.ietf.org/html/rfc2616#section-14.32 只为 Pragma 定义“无缓存”。可能是您的浏览器看到了 Pragma 标头并决定响应不可缓存。
-
无论如何,你能提供浏览器和服务器之间通信的捕获吗?你确定你没有在萤火虫或类似物中检查“忽略缓存”吗?您确定后续请求没有 If-Modified-Since / If-None-Match 标头吗?
-
我正在使用 chrome 开发者工具,我确信缓存不会被忽略,因为我在 php 中做了类似的事情。
标签: node.js response offline-caching http-caching image-caching