IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> HTTP Range,If-Range,If-Match比较和实践 -> 正文阅读

[网络协议]HTTP Range,If-Range,If-Match比较和实践

Range,If-Range,If-Match是HTTP中的几个头字段,其中Range和If-Range配合可以实现断点续传,If-Match也可以和Range配合,但底层逻辑确是不同。

Range: 按指定范围获取资源,范围越界报416。
If-Range: 断点续传恢复时,用If-Range携带上次获得的资源的etag或Last-Modified检查资源是否已发生变化,是则需要重新下载整个资源,否则取本次Range指定范围的资源。无论是否匹配都只会返回200。
If-Match: 如果资源未变动,则上传资源,否则报412。

btw: MDN上关于If-Match的描述有点小错误,即If-Match不匹配时,报412而不是416,更关键的是If-Match和Range虽然可以搭配使用,逻辑上不符合断点续传的要求,所以业务中,就不要使用Range+If-Match了。博主还提了一个PR,现在已经修正。

在这里插入图片描述

下面是一个实际的例子,包括了13个case。

其中使用了一个letter.txt文件作为资源文件。

[root@test01 conf]# cat ../html/letter.txt 
abcdefghijklmnopqrstuvwxyz

server {
		listen 80;
        server_name  test;
		
		root html;


        access_log  logs/200_range_access.log  main;
		error_log logs/200_range_error.log debug;

		location / {
			#本例验证Range,If-Range,If-Match使用文件letter.txt
		}

    }
#测试实例
#case1:验证letter.txt可访问

#[root@test01 conf]# curl test/letter.txt
#abcdefghijklmnopqrstuvwxyz

#case2:取etag
#[root@test01 conf]# curl test/letter.txt -I
#HTTP/1.1 200 OK
#Server: nginx/1.20.1
#Date: Wed, 06 Apr 2022 02:00:38 GMT
#Content-Type: text/plain; charset=utf-8
#Content-Length: 27
#Last-Modified: Fri, 03 Sep 2021 02:13:49 GMT
#Connection: keep-alive
#ETag: "613184dd-1b"
#Accept-Ranges: bytes
#
#case3:If-Match匹配etag
#[root@test01 conf]# curl test/letter.txt -H 'If-Match: "613184dd-1b"' -I
#HTTP/1.1 200 OK
#Server: nginx/1.20.1
#Date: Wed, 06 Apr 2022 02:01:00 GMT
#Content-Type: text/plain; charset=utf-8
#Content-Length: 27
#Last-Modified: Fri, 03 Sep 2021 02:13:49 GMT
#Connection: keep-alive
#ETag: "613184dd-1b"
#Accept-Ranges: bytes
#
#case4:If-Match不匹配etag,报412
#[root@test01 conf]# curl test/letter.txt -H 'If-Match: "613184dd-1c"' -I
#HTTP/1.1 412 Precondition Failed
#Server: nginx/1.20.1
#Date: Wed, 06 Apr 2022 02:01:03 GMT
#Content-Type: text/html; charset=utf-8
#Content-Length: 173
#Connection: keep-alive
#
#case5:If-Match加Range正常case
#[root@test01 conf]# curl test/letter.txt -H 'If-Match: "613184dd-1b"' -H 'Range: bytes=0-5'  -I
#HTTP/1.1 206 Partial Content
#Server: nginx/1.20.1
#Date: Wed, 06 Apr 2022 02:01:20 GMT
#Content-Type: text/plain; charset=utf-8
#Content-Length: 6
#Last-Modified: Fri, 03 Sep 2021 02:13:49 GMT
#Connection: keep-alive
#ETag: "613184dd-1b"
#Content-Range: bytes 0-5/27
#
#case6:If-Match加Range,Range越界,报416
#[root@test01 conf]# curl test/letter.txt -H 'If-Match: "613184dd-1b"' -H 'Range: bytes=33'  -I
#HTTP/1.1 416 Requested Range Not Satisfiable
#Server: nginx/1.20.1
#Date: Wed, 06 Apr 2022 02:01:25 GMT
#Content-Type: text/html; charset=utf-8
#Content-Length: 197
#Connection: keep-alive
#Content-Range: bytes */27
#
#case7:If-Match加Range,etag不匹配且Range越界,报412,说明If-Match优先级高于Range
#[root@test01 conf]# curl test/letter.txt -H 'If-Match: "613184dd-1c"' -H 'Range: bytes=33'  -I
#HTTP/1.1 412 Precondition Failed
#Server: nginx/1.20.1
#Date: Wed, 06 Apr 2022 02:01:30 GMT
#Content-Type: text/html; charset=utf-8
#Content-Length: 173
#Connection: keep-alive
#
#case8:If-Match加Range,交换If-Match和Range的次序,依然报412,说明和参数顺序无关,再次印证了If-Match优先级高于Range
#[root@test01 conf]# curl test/letter.txt -H 'Range: bytes=33' -H 'If-Match: "613184dd-1c"' -I
#HTTP/1.1 412 Precondition Failed
#Server: nginx/1.20.1
#Date: Wed, 06 Apr 2022 02:02:06 GMT
#Content-Type: text/html; charset=utf-8
#Content-Length: 173
#Connection: keep-alive

#case9:引入If-Range,所有参数正确
#[root@test01 conf]# curl test/letter.txt -H 'Range: bytes=0-5' -H 'If-Match: "613184dd-1b"' -H 'If-Range: "613184dd-1b"' -I
#HTTP/1.1 206 Partial Content
#Server: nginx/1.20.1
#Date: Wed, 06 Apr 2022 02:42:30 GMT
#Content-Type: text/plain; charset=utf-8
#Content-Length: 6
#Last-Modified: Fri, 03 Sep 2021 02:13:49 GMT
#Connection: keep-alive
#ETag: "613184dd-1b"
#Content-Range: bytes 0-5/27
#
#case10:If-Range不匹配,直接返回200,而不是412,符合业务逻辑,即断点续传应用质量,如果文件发生改变,则需全部重新下载
#[root@test01 conf]# curl test/letter.txt -H 'Range: bytes=0-5' -H 'If-Match: "613184dd-1b"' -H 'If-Range: "613184dd-1c"' -I
#HTTP/1.1 200 OK
#Server: nginx/1.20.1
#Date: Wed, 06 Apr 2022 02:42:37 GMT
#Content-Type: text/plain; charset=utf-8
#Content-Length: 27
#Last-Modified: Fri, 03 Sep 2021 02:13:49 GMT
#Connection: keep-alive
#ETag: "613184dd-1b"
#Accept-Ranges: bytes
#
#case11:If-Match和If-Range的etag不匹配,返回412,逻辑上If-Match优先
#[root@test01 conf]# curl test/letter.txt -H 'Range: bytes=0-5' -H 'If-Match: "613184dd-1c"' -H 'If-Range: "613184dd-1c"' -I
#HTTP/1.1 412 Precondition Failed
#Server: nginx/1.20.1
#Date: Wed, 06 Apr 2022 02:42:44 GMT
#Content-Type: text/html; charset=utf-8
#Content-Length: 173
#Connection: keep-alive
#
#case12:If-Match etag不匹配,返回412
#[root@test01 conf]# curl test/letter.txt -H 'Range: bytes=0-5' -H 'If-Match: "613184dd-1c"' -H 'If-Range: "613184dd-1b"' -I
#HTTP/1.1 412 Precondition Failed
#Server: nginx/1.20.1
#Date: Wed, 06 Apr 2022 02:42:49 GMT
#Content-Type: text/html; charset=utf-8
#Content-Length: 173
#Connection: keep-alive
#
#case13:Range越界,If-Match和If-Range etag不匹配,返回412,依然是If-Match优先
#[root@test01 conf]# curl test/letter.txt -H 'Range: bytes=33' -H 'If-Match: "613184dd-1c"' -H 'If-Range: "613184dd-1c"' -I
#HTTP/1.1 412 Precondition Failed
#Server: nginx/1.20.1
#Date: Wed, 06 Apr 2022 02:42:59 GMT
#Content-Type: text/html; charset=utf-8
#Content-Length: 173
#Connection: keep-alive

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2022-04-07 23:04:59  更:2022-04-07 23:05:20 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 4:45:34-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码