Last-Modified和If-Modified-Since是如何工作的?

服务器发送 “Last-Modified” 响应头以指定所请求资源的上一次修改日期。例如:

1
Last-Modified: Tue, 20 Oct 2015 07:28:20 GMT

‘If-Modified-Since’ 请求头由浏览器发送,以指定资源的缓存副本的最后修改日期(保存在浏览器中)。此标头的值与先前收到的“Last-Modified”标头的值相同。例如:

1
If-Modified-Since: Tue, 20 Oct 2015 07:28:20 GMT

使用上述标头的目的是为了避免在上次访问后没有更改资源时不必要的资源转移,从而节省带宽并提高性能。

如何工作的?

以下是使用两个标头的一般高级步骤:

  1. 服务器接收特定资源的正常HTTP请求,例如XYZ。

  2. 服务器端准备响应。服务器端逻辑希望浏览器在本地缓存XYZ。默认情况下,所有浏览器始终缓存资源(规范),因此不需要响应中的特殊标头。服务器还可以显式发送“Cache-Control”以指定缓存的最大年龄。

  3. 服务器在响应中包含标头“Last-Modified”。它看起来像这样:

    1
    Last-Modified: Tue, 20 Oct 2015 07:28:20 GMT

    此标头指示在服务器端上次修改XYZ的日期时间。

  4. 服务器还可以在响应中包含以下标头:

    1
    Cache-Control: no-cache

    这是一个可选标题。没有它,通过链接访问资源或通过输入地址栏中的链接等操作直接使用浏览器缓存,并且不会向服务器发送请求以检查缓存的有效性。此处有效性表示:自第一次访问以来资源XYZ是否已更改。如果我们不使用此标题,则浏览器刷新/重新加载(通常是F5或Ctrl + r或浏览器中的重新加载按钮)仍然有效,并且将检查缓存的有效性。’no-cache’只是强制通过在使用缓存副本之前将请求提交给源服务器来检查缓存有效性。

  5. 服务器使用上面的标头,正文中的XYZ以及状态代码200发送响应。浏览器显示资源,同时将资源与标头信息一起缓存。

  6. 稍后,同一浏览器再次请求相同的资源XYZ。以下请求标头:

    1
    If-Modified-Since: Tue, 20 Oct 2015 07:28:20 GMT
  7. 收到XYZ请求以及’If-Modified-Since’ 标头后,服务器端逻辑通过比较XYZ的当前修改日期和请求头中接收的日期来检查XYZ是否需要资源的新副本。

    • 如果请求的If-modified-since与当前修改的XYZ日期相同,则服务器使用空的响应体发送回状态代码304(未修改)。浏览器使用XYZ的缓存副本。
    • 如果请求的If-modified-since值小于当前修改的XYZ日期,则服务器将发送回正文中的新XYZ资源以及状态代码200。具有新值的“Last-Modified”标头也包含在响应中。浏览器使用新的XYZ并使用新数据更新其缓存。
0%