【发布时间】:2012-01-27 16:16:33
【问题描述】:
现在我正在尝试尽量减少对我网站的 304 请求。我已经实施了这里要求的建议:
Asking browsers to cache as aggressively as possible
但是,无论我做什么,有些图像都拒绝从缓存中拉出,即使它们与被拉出的其他图像相似。现在我们正在使用 IIS 7.5 和 chrome 来查看网络流量。
下面是图片的初始响应示例,btn-blue.png,将从缓存中提取:
Accept-Ranges:bytes
Content-Length:49585
Content-Type:image/png
Date:Fri, 27 Jan 2012 16:02:26 GMT
ETag:"26cb96cdccc1:0"
Expires:Sat, 31 Dec 2012 00:00:00 GMT
Last-Modified:Thu, 26 Jan 2012 20:49:46 GMT
Server:Microsoft-IIS/7.5
X-Powered-By:ASP.NET
以下是图像响应标头 topnav-blue-poweredbyipipeline.png 的示例,它永远不会从缓存中拉取:
Accept-Ranges:bytes
Content-Length:2680
Content-Type:image/png
Date:Fri, 27 Jan 2012 16:02:17 GMT
ETag:"b85767a6cdccc1:0"
Expires:Sat, 31 Dec 2012 00:00:00 GMT
Last-Modified:Thu, 26 Jan 2012 20:49:47 GMT
Server:Microsoft-IIS/7.5
X-Powered-By:ASP.NET
知道为什么一个会拉而另一个不会吗?
【问题讨论】:
-
您的意思是“最大化”304 响应吗?您需要考虑将与缓存相关的标头添加到响应中(其中有几个,不同浏览器的处理方式不同),然后 ETag 和 Expires 也是相关的。
-
实际上我正在寻找它,以便浏览器根本不需要调用服务器。只需将其从缓存中拉出即可。现在它正在收到一条 304 消息,但我希望它不必首先拨打该电话。
-
浏览器必须至少下载一次位于任何特定 url 的内容。由服务器“要求”浏览器缓存它(同时还指定“如何”和“多长时间”),并由浏览器来尊重这一点。服务器通过响应头提供这些指令(一个单独的研究;我只是给你指点),我很确定所有流行的浏览器都会遵守这些指令而不会对你撒谎。
-
你能准确定义“从缓存中拉取”和“不从缓存中拉取”的含义吗?
-
当然!在 chrome 中查看开发人员工具中的网络选项卡时,一些图像会在大小列下显示“(来自缓存)”,而其他图像会显示“250B”或类似的内容。同样在“状态”列下,如果它询问服务器,它会说“304”,如果没有,它会说“200”。所以我假设标记为“(来自缓存”)的那些来自缓存,而“304”是从缓存中使用的,但最初并未从中提取。