Apache不直接实现断点续传,其作用是透传Range请求头与Content-Range响应头,并禁用压缩/缓存干扰;真正支持断点续传必须由Java Web应用(如Tomcat)通过解析Range、设置206状态码、用RandomAccessFile分段输出来完成。

Apache 本身不直接处理 Java Web 应用的业务逻辑,它通常作为反向代理(如通过 mod_proxy_ajp 或 mod_proxy_http)将请求转发给后端 Tomcat 等 Servlet 容器。因此,断点续传能力**必须由 Java Web 应用自身实现**,而 Apache 的角色是正确透传关键 HTTP 头、避免干扰 Range 请求流程。
确保 Apache 透传 Range 相关请求头与响应头
默认情况下,某些 Apache 配置会过滤或重写 Range 请求,导致后端收不到 Range 头,从而无法触发断点逻辑。需在虚拟主机或目录配置中显式放行:
- 启用
mod_headers和mod_proxy(确保已加载) - 添加以下指令,允许客户端 Range 请求透传到后端:
ProxyPass / http://localhost:8080/ retry=0
ProxyPassReverse / http://localhost:8080/
# 关键:禁止 Apache 缓存并强制透传 Range 和 Accept-Ranges
Header always set Accept-Ranges "bytes"
Header always pass Content-Range
Header always pass ETag
Header unset Vary
禁用 Apache 对大文件响应的自动缓冲或压缩干扰
Apache 若开启 mod_deflate 或使用 mod_cache,可能对分块响应(206 Partial Content)做错误处理,比如压缩整个响应体导致 Content-Range 不匹配,或缓存 200 响应覆盖 206。建议:
- 对下载路径(如
/download/*)禁用压缩:SetEnvIfNoCase Request_URI ^/download/ no-gzip - 禁用缓存:
Header set Cache-Control "no-store, must-revalidate" - 避免使用
mod_cache或mod_file_cache处理动态下载接口
Java Web 层必须完成的核心逻辑
Apache 只是通道,真正支撑断点续传的是你的 Servlet 或 Spring Controller。关键动作包括:
立即学习“Java免费学习笔记(深入)”;
- 检查请求头
Range是否存在且格式合法(如bytes=1024-或bytes=1024-2047) - 读取文件总大小,校验 Range 范围不越界(
start < file.length()) - 使用
RandomAccessFile定位起始偏移,配合缓冲区(如 8KB)逐段输出 - 设置响应状态码为
206 Partial Content,并写入Content-Range(如bytes 1024-2047/10485760)、Content-Length(本次传输字节数)、Accept-Ranges: bytes - 对不带 Range 的请求,仍返回完整文件(200 OK),保持兼容性
额外健壮性建议
生产环境常见问题及应对:
-
多 Range 请求(如
bytes=0-1023,2048-3071):标准浏览器极少发送,可选择忽略或返回 416;Spring Boot 默认不支持,建议只处理单 Range - ETag 与 Last-Modified:配合断点使用,避免客户端因缓存误判文件变更;Java 层应基于文件内容或最后修改时间生成强 ETag
-
超大文件内存控制:禁用
response.getOutputStream().write(byte[])全量加载;始终用RandomAccessFile.getChannel().transferTo()或流式分段拷贝 -
Tomcat 连接器配置:在
server.xml中确认maxSwallowSize="-1"(防 Tomcat 吞掉 Range 头)和disableUploadTimeout="true"


















