Nginx 默认支持视频文件范围请求,关键在于正确配置 location、确保 MIME 类型准确、避免禁用 Accept-Ranges,并预先将 MP4 的 moov box 移至文件开头以支持拖动。

Nginx 默认对 MP4、FLV 等视频文件支持范围请求(Range Requests),但要确保拖动播放(seek)正常,关键不是额外开启某个开关,而是保证 location 配置不意外禁用或干扰范围请求机制,并正确设置响应头与文件类型。
确保启用 range 请求支持
Nginx 从 1.1.2 版本起默认开启 range 模块(ngx_http_range_module),无需手动加载。只要没显式关闭,静态视频文件就能响应 Range: bytes=xxx-yyy 请求。检查配置中是否误加了以下禁止行为:
-
add_header Accept-Ranges "none";—— 删除或改为"bytes" -
disable_symlinks on;影响文件读取权限时,可能导致 range 失败(需确保 Nginx 有读权限) -
sendfile on;建议保持开启(提升大文件传输效率),它与 range 兼容;但若使用tcp_nopush on;配合不当,极少数旧内核下可能影响首帧延迟,非必须可暂不设
为视频文件匹配合适的 location 并设置 MIME 类型
拖动依赖浏览器识别文件类型并发起 range 请求。若响应头 Content-Type 错误(如返回 text/plain),部分浏览器会拒绝 seek。推荐写法:
location ~ \.(mp4|mov|webm|ogg|avi|mkv)$ {
add_header Content-Type "video/mp4";
add_header Accept-Ranges "bytes";
add_header Cache-Control "public, no-transform";
# 可选:添加 CORS 支持(跨域播放时需要)
add_header Access-Control-Allow-Origin "*";
add_header Access-Control-Allow-Methods "GET, HEAD, OPTIONS";
add_header Access-Control-Allow-Headers "Range";
add_header Access-Control-Expose-Headers "Content-Length,Content-Range";
}注意:Content-Type 应按实际格式设置(如 video/webm 对应 .webm),Nginx 默认 MIME 映射通常已覆盖常见格式,但显式声明更稳妥。
处理 MP4 文件的 moov box 位置问题
拖动失败的常见原因是 MP4 的 moov(元数据)位于文件末尾(“moov at end”)。浏览器需先下载完整文件才能解析时长和关键帧索引,导致无法拖动。这不是 Nginx 配置问题,而是源文件问题。解决方法:
- 用
ffmpeg重写 MP4,将moov移到开头:ffmpeg -i input.mp4 -c copy -movflags +faststart output.mp4 - 或使用
qt-faststart工具(轻量) - Nginx 无法在运行时修复该问题,只能由前端/转码环节保障
验证 range 是否生效
用 curl 检查响应头和分段内容:
curl -I -H "Range: bytes=0-999" http://your-site.com/video.mp4
成功响应应包含:
HTTP/1.1 206 Partial ContentContent-Range: bytes 0-999/12345678Accept-Ranges: bytesContent-Type: video/mp4
若返回 200 OK 且无 Content-Range,说明 range 未触发,检查 location 是否被其他规则覆盖(如被 proxy_pass 或 rewrite 提前截断)。


















