HTTP协议中的If-Modified-Since头部是标准的HTTP请求头部之一,其作用是帮助客户端节省带宽和服务器资源,通过检查资源的最后修改时间,只有当资源在客户端上次请求之后被修改了,客户端才会重新请求资源,否则将返回一个"304 Not Modified"状态码。使用这个头部,可以实现浏览器缓存的功能,减少网络流量和提高性能。
使用If-Modified-Since头部需要客户端在HTTP请求中携带该头部,通常向服务端发送GET请求时,服务器会在响应头部中添加一个"Last-Modified"头部,表示该资源的最后修改时间,在下一次请求中,客户端携带的"If-Modified-Since"头部值可以设置为该值,表示如果资源的最后修改时间等于或晚于该值,则返回资源,否则返回"304 Not Modified"状态码,客户端就不再需要下载该资源了。
以下是两条使用If-Modified-Since头部的示例说明:
1.使用If-Modified-Since头部实现HTTP请求的缓存
假设客户端已经请求了一个静态资源,比如图片或者css文件,服务器在响应中返回了资源的最后修改时间,客户端同时保存了这个值。在后续请求时,客户端会在Header中发送If-Modified-Since头部,值为上次获取的最后修改时间。
如果这个资源没有被修改,则服务器将返回304 Not Modified状态码,告诉客户端可以直接从缓存中获取数据,从而节省了带宽和服务器资源。
示例请求头部:
GET /static/image.png HTTP/1.1
Host: example.com
If-Modified-Since: Wed, 02 Jun 2021 10:00:00 GMT
示例响应头部:
HTTP/1.1 304 Not Modified
Last-Modified: Wed, 02 Jun 2021 10:00:00 GMT
2.使用If-Modified-Since头部实现增量更新
某网站提供一个最新的新闻列表,客户端需要在每隔一段时间内获取最新的新闻,但是该新闻列表并不是实时更新的,而是每隔一段时间才会更新一次。
使用If-Modified-Since头部可以实现增量更新的功能。客户端在首次请求新闻列表时获取到最后更新的时间,下一次请求时将该时间作为If-Modified-Since头部的值发送给服务器,只有当新闻列表最后更新时间大于这个值时,服务器才返回最新新闻,否则返回304状态码。
示例请求头部:
GET /news HTTP/1.1
Host: example.com
If-Modified-Since: Fri, 25 Jun 2021 10:00:00 GMT
示例响应头部:
如果新闻列表在该时间之后有更新,服务端需要返回新的内容和新的Last-Modified头部:
HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Last-Modified: Sat, 26 Jun 2021 10:00:00 GMT
<html>
<body>
<h1>新闻列表</h1>
<ul>
<li>新闻 1</li>
<li>新闻 2</li>
<li>新闻 3</li>
</ul>
</body>
</html>
如果没有更新,服务端只需返回一个空的响应体和304 Not Modified头部,客户端从缓存中获取新闻列表:
HTTP/1.1 304 Not Modified
Last-Modified: Fri, 25 Jun 2021 10:00:00 GMT
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:HTTP的If-Modified-Since头部有什么作用? - Python技术站