---

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。

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部