一文读懂4个HTTP条件请求头部

HTTP常用的条件请求头部有4个,它们是If-Modified-Since,If-Unmodified-Since,If-Match,If-None-Match。深刻理解其适用的场景和解决的问题,是灵活应用它们的关键。

If-Modified-Since: 使用最简单
1. 只能用于GET/HEAD方法
2. 只有一个应用场景,更新cache
3. 如果同时存在If-None-Match,则If-None-Match生效
If-Modified-Since的语义是如果在设定时间之后,资源发生了修改,则由WEB服务器/反向代理返回完整的资源和200,否则返回304,并更新cache,更新cache是指更新Max-age,Etag,Date等返回200时携带的和缓存有关的头字段。【The equivalent 200 OK response would have included the headers Cache-Control, Content-Location, Date, ETag, Expires, and Vary.】
If-Modified-Since携带的时间通常来源于上次响应的Last-Modified时间。

If-Unmodified-Since:主要针对POST等非安全方法,它的语义是如果资源自上次修改以来没有修改,则可以执行本次的post动作,否则返回412,表示更改资源有冲突。

If-Unmodified-Since有2个主要用途:
1.多人共同编辑相同资源,每次更新资源用post并携带Last-Modified时间,如果资源自上次取资源已经发生改变,则说明有人已经编辑,则取消本次编辑,乐观锁。
2.配合Range实现断点续传,断点续传恢复时,请求携带Last-Modified时间,同样,如果资源自上次取资源已经发生改变,则需要重传整个资源。

注:MDN此处有误,If-Range应为Range,因为If-Range是另一个条件请求头部,和If-Unmodified-Since没有关系。

In conjunction with a range request using the If-Range header, this header can be used to ensure that the new fragment requested comes from an unmodified document.

博主在MDN上提交的PR

一个Range和If-Unmodified-Since配合使用的例子:

#取Last-Modified时间
[root@test01 ~]# curl test/letter.txt -I
HTTP/1.1 200 OK
Server: nginx/1.20.1
Date: Fri, 25 Feb 2022 06:15:32 GMT
Content-Type: text/plain
Content-Length: 27
Last-Modified: Fri, 03 Sep 2021 02:13:49 GMT
Connection: keep-alive
ETag: "613184dd-1b"
Accept-Ranges: bytes

#使用Range和If-Unmodified-Since,时间等于Last-Modified,返回206和指定范围的消息
[root@test01 ~]# curl test/letter.txt -H 'Range: bytes=0-5' -H 'If-Unmodified-Since: Fri, 03 Sep 2021 02:13:49 GMT' -I
HTTP/1.1 206 Partial Content
Server: nginx/1.20.1
Date: Fri, 25 Feb 2022 06:15:55 GMT
Content-Type: text/plain
Content-Length: 
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值