前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >服务端返回 304 如何做到的?

服务端返回 304 如何做到的?

作者头像
程序猿石头
发布2021-07-15 12:44:37
1.3K0
发布2021-07-15 12:44:37
举报
文章被收录于专栏:程序猿石头程序猿石头

Hi,大家好,我是石头哥。

大家都知道 HTTP 状态码 304 代表内容没有变,客户端可以直接用缓存,进而节省带宽和提高效率。

但具体流程是怎么样的呢?服务端和客户端(例如:浏览器)是怎么交互的呢?

服务端怎么知道客户端内容没有变化(毕竟每个客户端得到的内容可能不一样),直接返回 304 呢?

今天就花2分钟来学习下这知识点。

Last-Modified/If-Modified-Since

通常服务器知道你所请求的数据的最后修改时间,并且 HTTP 为服务器提供了一种将最近修改数据连同你请求的数据一同发送的方法。

如果你第二次 (或第三次,或第四次) 请求相同的数据,你可以告诉服务器你上一次获得的最后修改日期:在你的请求中发送一个 If-Modified-Since 头信息,它包含了上一次从服务器获得数据所获得的时间。

如果数据从那时起没有改变,服务器将返回一个特殊的 HTTP 状态代码 304,这意味着 “从上一次请求后这个数据没有改变”。

这有啥好处呢?

当服务器发送状态编码 304 时,不再重新发送数据,节省了带宽,客户端仅仅获得了这个状态代码。此时,客户端不需要又一次地下载相同的数据(服务器假定你有本地的缓存数据)。

所有现代的浏览器都支持最近修改 (last-modified) 的数据检查。

如果你曾经访问过某页,一天后重新访问相同的页时发现它没有变化,并奇怪第二次访问时页面加载得如此之快——这就是原因所在。

你的浏览器首次访问时会在本地缓存页面内容,当你第二次访问,浏览器自动发送首次访问时从服务器获得的最近修改日期。服务器简单地返回 304: Not Modified,因此浏览器就会知道从本地缓存加载页面。

ETag/If-None-Match

ETag 是实现与最近修改数据时间检查同样的功能的另一种方法:没有变化时不重新下载数据。

其工作方式是:服务器回传你所请求的数据的同时,发送这些数据的 hash (在 ETag 头信息中给出),hash 的确定完全取决于服务器(比如简单点md5值)。

当第二次请求数据时,客户端需要在 If-None-Match 头信息中包含 ETag hash。

假设服务端通过计算得到第二次请求数据的 hash 一样,就代表数据没有变化,此时将直接返回 304 状态码。

好了,全文完,今天你学到了吗?

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-06-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序猿石头 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Last-Modified/If-Modified-Since
  • ETag/If-None-Match
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档