HTTP 范围Range请求

devtools/2025/1/15 7:05:39/

引言

在现代Web应用中,HTTP范围请求是一种重要的技术,允许客户端请求资源的部分内容,而不是整个资源。这对于大型文件的传输尤其有用,如视频流、断点续传下载等。本文将深入探讨HTTP范围请求的工作原理、实现方法和应用场景。

HTTP范围请求的基本概念

HTTP范围请求通过 Range头部字段向服务器请求资源的一个或多个子范围,而不是整个资源。服务器通过 Content-Range头部字段响应请求的部分内容。

示例

客户端请求资源的某个范围:

GET /example.mp4 HTTP/1.1
Host: www.example.com
Range: bytes=0-999
​

服务器响应请求的部分内容:

HTTP/1.1 206 Partial Content
Content-Range: bytes 0-999/10000
Content-Length: 1000
Content-Type: video/mp4...(返回前1000字节的数据)...
​

Range 头部

Range头部指定了请求资源的字节范围。格式如下:

Range: bytes=start-end
​
  • start是起始字节位置,end是结束字节位置(包括在内)。
  • 如果省略 start,表示请求最后 end个字节:Range: bytes=-500
  • 如果省略 end,表示从 start到资源末尾的所有字节:Range: bytes=500-

Content-Range 头部

Content-Range头部用于服务器响应范围请求,指示返回内容的实际范围和资源总大小。格式如下:

Content-Range: bytes start-end/total
​
  • start和 end表示返回内容的字节范围。
  • total表示资源的总大小。

实现范围请求

配置服务器支持范围请求

大多数Web服务器默认支持范围请求,如Apache、Nginx等。确保服务器配置正确即可:

Nginx 配置示例

在Nginx配置文件中,确保没有禁用范围请求:

server {listen 80;server_name www.example.com;location / {root /var/www/html;# 确保以下指令存在或被启用# allow_ranges on; # 默认开启}
}
​
Apache 配置示例

在Apache配置文件中,确保启用了 mod_headers模块:

<IfModule mod_headers.c>Header set Accept-Ranges "bytes"
</IfModule>
​
处理范围请求的代码示例

如果需要在应用层面手动处理范围请求,以下是一个示例,展示如何在Node.js中实现:

const http = require('http');
const fs = require('fs');
const path = require('path');const server = http.createServer((req, res) => {const filePath = path.join(__dirname, 'example.mp4');const stat = fs.statSync(filePath);const total = stat.size;if (req.headers.range) {const range = req.headers.range;const parts = range.replace(/bytes=/, "").split("-");const partialStart = parts[0];const partialEnd = parts[1];const start = parseInt(partialStart, 10);const end = partialEnd ? parseInt(partialEnd, 10) : total - 1;const chunksize = (end - start) + 1;const file = fs.createReadStream(filePath, { start: start, end: end });res.writeHead(206, {'Content-Range': `bytes ${start}-${end}/${total}`,'Accept-Ranges': 'bytes','Content-Length': chunksize,'Content-Type': 'video/mp4'});file.pipe(res);} else {res.writeHead(200, {'Content-Length': total,'Content-Type': 'video/mp4'});fs.createReadStream(filePath).pipe(res);}
});server.listen(8000, () => {console.log('Server is listening on port 8000');
});
​

应用场景

视频流

在视频流应用中,范围请求允许客户端根据需要缓冲视频的特定部分,从而提高观看体验和带宽利用率。

断点续传下载

范围请求支持断点续传下载。当下载中断时,客户端可以从上次中断的位置继续下载,而不是重新下载整个文件。

大文件预览

范围请求允许客户端只下载文件的部分内容进行预览,比如PDF文档、图像等,从而节省时间和带宽。

常见问题及解决方法

请求范围无效

如果服务器返回 416 Range Not Satisfiable,表示请求的范围无效。确保请求的范围在资源的有效范围内。

性能问题

处理大量范围请求可能会导致性能问题。确保服务器有足够的资源和优化措施,如缓存机制,来应对高并发请求。


http://www.ppmy.cn/devtools/150609.html

相关文章

MTK6768 Android13 亮度条均匀调节实现

文章目录 需求&#xff1a;问题现象&#xff1a;需求实现疑难问题点&#xff1a;相关资源修改的文件调试技巧具体需求实现去除亮度弹框设置去掉跳转逻辑SystemUI亮度条长按跳转屏蔽 实现亮度均匀调节PhoneWindowManager.javaBrightnessUtils convertLinearToGammaFloatBrightne…

Flink类加载机制详解

1. 总览 在运行Flink应用时,它会加载各种类,另外我们用户代码也会引入依赖,由于他们依赖版本以及加载顺序等不同,就可能会导致冲突,所以很要必要了解Flink是如何加载类的。 根据加载的来源的不同,我们可以将类分为三种: Java Classpath:Java类路径下,这是Java通用的…

LabVIEW智能水肥一体灌溉控制系统

本文详细介绍了一种基于LabVIEW的智能水肥一体灌溉控制系统的设计与实现。该系统采用模糊控制策略&#xff0c;能够自动调节土壤湿度和肥液浓度&#xff0c;满足不同作物在不同生长阶段的需求&#xff0c;有效提高水肥利用效率&#xff0c;对现代精准农业具有重要的实践和推广价…

MATLAB中rescale函数用法

目录 语法 说明 示例 缩放到单位区间 缩放到指定范围 缩放矩阵列和行 rescale函数的功能是数组元素的缩放范围。 语法 R rescale(X) R rescale(X,a,b) R rescale(___,Name,Value) 说明 R rescale(X) 将 X 的条目缩放到区间 [0,1]。输出数组 R 的大小与 X 相同。 R…

ElectronSharp,.Net跨平台的多一种选择

文章目录 背景解决方案小结 背景 最近有个项目是基于Blazor的跨平台项目&#xff0c;要求在Windows、安卓平板和Mac上能跑&#xff0c;而且要求实现视频通话功能&#xff0c;而Web里的视频通话无非就是基于WebRTC技术。经过前期调研&#xff0c;通过套壳MAUI&#xff0c;Windo…

PyCharm 引用其他路径下的文件报错 ModuleNotFound 或报红

PyCharm 中引用其他路径下的文件提示 ModuleNotFound&#xff0c;将被引用目录添加到系统路径&#xff1a; # # 获取当前目录 dir_path os.path.dirname(os.path.realpath(__file__)) # # 获取上级目录 parent_dir_path os.path.abspath(os.path.join(dir_path, os.pardir))…

【进程与线程】程序和进程在内存中的表现

在计算机系统中&#xff0c;程序和进程是两个密切相关但又有本质区别的概念&#xff0c;尤其在内存中的表现上有显著不同&#xff1a; 在这张图中可以直观地看出程序和进程在内存中的结构区别。 基本定义 程序 程序 是一个 静态实体&#xff0c;表示一组写好的指令和数据的…

matlab GUI 打包成exe可执行文件

1、在命令行窗口输入deploytool回车&#xff0c;选择第一个。 2.选择刚刚gui的.mlapp程序&#xff08;Mortgage.mlapp&#xff09; 3、右上角Settings&#xff08;1&#xff09;中可以更改生成的路径&#xff0c; (2)可以替换exe的图标缩量图&#xff0c;默认就是下图 (3)是指示…