我已经使用 IIS 重写规则和应用程序请求路由模块在 Azure 云服务中设置了反向代理服务器(根据说明这里。除了调用我创建的用于下载 mp4 文件的端点外,一切都运行良好。当请求包含 Range 标头时,这些端点可以提供部分内容。我遇到的问题是,当我直接访问服务器时,它会正确响应 206(部分内容)和正确的字节范围,但有时当我通过代理服务器访问端点时,它会响应 200 和完整文件内容,这会导致 Chrome 中的视频播放出现错误。
例子: 当直接向服务器发送如下请求时:
获取 server.domain.com/api/adFile/fileName 标头:范围:字节=168-3922822
我正确收到了 206 响应。以下是响应中的一些相关标头:
- 缓存控制:无缓存
- 指令:无缓存
- 内容长度:3922655
- 内容类型:video/mp4
- 内容-MD5:f1+K8OT8TEjvtlPU5iUY8a==
- 内容范围:字节 168-3922822/3922823
- 到期时间:-1
- 最后修改时间:2016 年 2 月 16 日星期二 15:46:46 GMT
- ETag:“0x8D336E86040C217”
- 服务器:Microsoft-IIS/8.0
- X-AspNet-版本:4.0.30319
- X-Powered-By:ASP.NET
当通过反向代理访问服务器时,请求如下:
GET proxy.domain.com/api/adFile/fileName 标头:范围:字节=168-3922822
我错误地收到了 200 状态代码和完整的文件内容。以下是该响应中的相关标题:
- 缓存控制:无缓存
- 指令:无缓存
- 内容长度:3922823
- 内容类型:video/mp4
- 内容-MD5:f1+K8OT8TEjvtlPU5iUY8a==
- 到期时间:-1 最后修改时间:2016 年 2 月 16 日星期二 15:46:46 GMT
- ETag:“0x8D336E86040C217”
- 服务器:Microsoft-IIS/8.5
- X-AspNet-版本:4.0.30319
- X-Powered-By:ASP.NET
- X-Powered-By:ARR/3.0
- X-Powered-By:ASP.NET
有什么方法可以修改代理行为以匹配主服务器的行为(即仅返回请求的部分内容)? 似乎它可能会缓存文件内容,并在请求的字节范围接近完整文件大小时为所有文件提供内容。
答案1
事实证明,修复此问题并不涉及修改反向代理服务器。我的目标服务缺少响应标头,当端点能够提供部分内容时,该标头是必需的:Accept-Ranges 标头。我修改了我的端点以包括接受范围:字节作为响应标头,让客户端知道端点能够提供部分内容。无论请求的是部分内容还是完整内容,都会包含此响应标头。缺少此标头的事实必定会干扰代理服务器,使其认为需要返回整个文件。无论如何,修复很简单,现在我的代理服务器可以愉快地处理部分内容的请求!