---
title: HTTP范围请求与大文件分片下载治理(Range/校验/速率)最佳实践
keywords:
- Range
- Partial Content
- Accept-Ranges
- 速率限制
- 分片校验
description: 通过解析与校验Range头、限制分片大小与速率,并统一返回206响应与Accept-Ranges,保障大文件下载的安全与可控。
categories:
- 文章资讯
- 技术教程
---
背景与价值
范围请求可被滥用导致资源耗尽。分片校验与速率治理保障下载体验与系统稳定。
统一规范
- Accept-Ranges:统一声明
bytes。 - 分片上限:单片最大(如≤8MB)。
- 速率限制:对频繁范围请求进行限速与审计。
核心实现
Range解析与校验
type Range = { start: number; end: number }
function parseRange(h: string | undefined, size: number): Range | null {
const s = (h || '').trim()
const m = s.match(/^bytes=(\d*)-(\d*)$/)
if (!m) return null
let start = m[1] ? Number(m[1]) : 0
let end = m[2] ? Number(m[2]) : size - 1
if (!Number.isFinite(start) || !Number.isFinite(end) || start < 0 || end < start || end >= size) return null
return { start, end }
}
function clamp(r: Range, maxChunk = 8 * 1024 * 1024): Range { const len = r.end - r.start + 1; if (len > maxChunk) return { start: r.start, end: r.start + maxChunk - 1 }; return r }
206响应构建
type Res = { setHeader: (k: string, v: string) => void; status: (n: number) => Res; end: (b?: any) => void }
function send206(res: Res, r: Range, size: number, chunk: Uint8Array) {
res.setHeader('Accept-Ranges', 'bytes')
res.setHeader('Content-Range', `bytes ${r.start}-${r.end}/${size}`)
res.status(206).end(chunk)
}
落地建议
- 严格校验Range头并限制分片大小与频率,统一返回206与Accept-Ranges。
验证清单
- Range是否合法且分片未超上限;是否正确下发206/Content-Range。

发表评论 取消回复