iPhone可在一台Apache服务器播放HTML5 MP4 另一台CentOS7.9服务器无法播放
问题根因判定
你对byte-range的测试方法有误,当前结果恰恰说明字节范围请求处理异常就是问题根源:
iPhone Safari对HTML5视频播放有强制要求:必须支持字节范围请求,否则会直接拒绝播放;而Windows、Mac、Android的浏览器容错性更高,即使服务器不支持字节范围也能正常加载全量视频播放。
你测试时加了-X HEAD参数,HEAD请求仅返回响应头不返回实体内容,Apache对该类请求的Range头处理逻辑和实际播放时的GET请求完全不同,无法作为判定依据。正常支持字节范围请求的服务器响应普通GET加Range头的请求时,应该返回206 Partial Content状态码,而你的测试返回的是200 OK,已经说明处理逻辑异常。
CentOS 7.9默认预装的Apache版本为2.4.6,该版本存在多个字节范围请求处理的已知bug,在开启mod_deflate、mod_cache等模块时极易触发该问题,而CentOS 8.4预装的Apache版本更高,已经修复了相关bug,这就是两台服务器表现不同的核心原因。
解决方案
- 第一步:先执行正确的验证命令确认问题:
curl -i -H "Range: bytes=50-100" https://example.com/big_buck_bunny.mp4
正常响应应该包含HTTP/1.1 206 Partial Content状态码、Content-Range: bytes 50-100/5510872响应头,响应体长度为51字节。如果返回200 OK即可确认问题。
- 第二步:优先排除压缩模块干扰,在Apache虚拟主机配置或者站点根目录的.htaccess文件中添加如下规则,禁止对视频文件执行gzip压缩:
<FilesMatch "\.(mp4|m4v|mov)$"> SetEnv no-gzip 1 SetEnv dont-vary 1 </FilesMatch>
修改后重启Apache验证播放是否正常。
- 第三步:如果上述操作无效,建议升级Apache版本:CentOS 7自带的2.4.6版本已经停止维护,存在多个已知功能和安全漏洞,可通过Remi源升级到官方最新稳定版2.4.x,即可从根源修复字节范围处理bug。
- 第四步:检查前置中间层配置:如果生产服务器前面部署有CDN、WAF、反向代理服务,需要确认这些中间件没有拦截Range请求头、没有强制修改视频资源的响应状态码,要允许Range头透传和206状态码正常返回。
内容的提问来源于stack exchange,提问作者user16674741
相关产品推荐
相关产品推荐

