HTTP 200 OK和HTTP 304 Not modified的由来

举报
汪子熙 发表于 2021/11/16 22:57:08 2021/11/16
【摘要】 这两个字段都和HTTP协议的缓存控制相关。浏览器缓存机制是通过HTTP协议Header里的Cache-Control(或Expires)和Last-Modified(或 Etag)等字段来实现。这两个字段的作用:1. 接收响应时,浏览器决定文件是否需要被缓存;2. 需要加载文件时,浏览器决定是否需要发出请求的字段。看一些例子:Cache-Control:max-age=115360000,表...

这两个字段都和HTTP协议的缓存控制相关。

浏览器缓存机制是通过HTTP协议Header里的Cache-Control(或Expires)和Last-Modified(或 Etag)等字段来实现。

这两个字段的作用:

1. 接收响应时,浏览器决定文件是否需要被缓存;

2. 需要加载文件时,浏览器决定是否需要发出请求的字段。

看一些例子:

Cache-Control:max-age=115360000,表示缓存有效期为115360000秒。如果115360000秒内需要再次请求这个文件,浏览器不会发出向服务器发出请求,而是直接使用本地的缓存的文件。这是HTTP/1.1标准中的字段。

这总情况能在Chrome开发者工具的Network标签页里看到from disk cache的提示:

从本地缓存中读取文件非常快速,上面的例子只花费了6毫秒:

Expires: Thu, 31 Dec 2018 23:55:55 GMT,表示该文件的过期时间是2018年12月31日晚上23点55分55秒,在这个时间之前浏览器都不会再次发出请求去获取该文件。这是HTTP/1.0中的字段。

在Chrome开发者工具的network标签页里能看到:

下面两个字段是发起请求时,服务器决定文件是否需要更新的字段。

Last-Modified: Thu, 26 Jul 2018 05:41:21 GMT,这表示这个文件最后的修改时间是2018年7月26日5点41分21秒。

浏览器会在下次请求的时候,把Last-Modified的值作为Request Header的If-Modified-Since字段带上。如果浏览器缓存的文件已经超过了Cache-Control(或者Expires),那么需要加载这个文件时,就会发出请求,请求的Header有一个字段为If-Modified-Since,如下图所示:

服务器接收到请求后,会把文件的Last-Modified时间和这个时间对比,如果时间没变,那么浏览器将返回304 Not Modified给浏览器:

如果时间有变化,那么服务器会返回200 OK,并返回相应的内容给浏览器。

下图第9行的get_header_field方法是服务器从浏览器发送过来的HTTP请求提取头部字段If-Modified-Since的值。

下图第16行的set_header_field方法是服务器设置Last-Modified头部字段的值。

下图就是服务器设置304 Not Modified响应的位置:

curl是利用URL语法在命令行方式下工作的开源文件传输工具,广泛应用在Unix,多种Linux发行版中。

在Windows系统下也有移植版。

curl尤其被广泛应用在github上众多开源软件和框架的安装script中,比如Kubernetes的一个本地运行工具:minikube。

安装script里有这样一个命令:

curl -Lo kubectl https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl && chmod +x kubectl && sudo cp kubectl /usr/local/bin/ && rm kubectl

其中下面的url在浏览器里打开,发现该txt文件只是维护了一个最新的版本号:

https://storage.googleapis.com/kubernetes-release/release/stable.txt

因此下面这个url里通过$定义的占位符,

https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl

会被替换成v1.11.2:

最终下载的url:

https://storage.googleapis.com/kubernetes-release/release/v1.11.2/bin/linux/amd64/kubectl

curl还有个用法是下载指定url的网页源代码,比如curl http://www.baidu.com

ABAP也有类似的工具,function module HTTP_GET:

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。