百度收录 / 方法解读

请求大文件时如何通过Content-Range头确认资源长度

当服务器返回416错误时,通过检查Content-Range头中的星号与斜杠后的数值,可以确认资源的当前长度。

确认416错误与资源长度

服务器返回416状态码时,通常是因为请求的范围超出了文档的实际长度。根据HTTP规范,响应头中必须包含Content-Range字段,该字段以星号(*)开头,表示无法满足的范围,随后紧跟斜杠和资源的当前长度。例如,Content-Range: bytes */800 表示请求的范围超出了实际只有800字节的资源。

在排查问题时,首先需要检查响应头中的Content-Range值。如果星号后的数字与服务器实际存储的文件大小不一致,说明请求的范围参数存在错误。这种错误通常发生在用户尝试断点续传时,请求的起始位置超过了文件的总字节数。确认资源长度是解决此类问题的第一步。

检查请求头中的Range参数

416错误的常见原因之一是Range请求头中的起始位置大于资源的实际长度。例如,请求1000-1999字节,但文件只有800字节。此时服务器会拒绝该请求,并返回416状态码。检查请求头中的Range值是否合理,是定位问题的关键。

如果Range头中的起始位置大于资源长度,或者结束位置小于起始位置,服务器通常会返回416错误。浏览器在遇到此错误时,通常会终止下载操作,或者重新请求整个文档而不包含范围头。通过对比请求头中的Range值与服务器返回的Content-Range头,可以快速判断是否为参数错误导致的416错误。

验证服务器是否支持范围请求

并非所有服务器都支持范围请求。如果服务器不支持,但客户端发送了Range头,服务器可能会返回416错误。因此,在确认请求参数无误后,需要验证服务器是否支持范围请求功能。可以通过发送不带Range头的请求来测试,如果返回200状态码,则说明服务器支持范围请求。

如果服务器不支持范围请求,但客户端发送了Range头,服务器可能会返回416错误。此时,可以通过移除Range头重新请求,或者检查服务器的配置,确认是否启用了范围请求功能。如果服务器不支持范围请求,客户端应避免发送Range头,以避免416错误。

判断浏览器行为与重试策略

当浏览器遇到416错误时,通常会终止下载操作,或者重新请求整个文档而不包含范围头。这是因为416错误表示请求的范围无法满足,浏览器无法继续断点续传。了解浏览器的行为有助于优化客户端的下载逻辑,避免不必要的错误重试。

在客户端开发中,可以监听416错误,并根据Content-Range头中的资源长度,调整下载策略。例如,如果请求的范围超出资源长度,可以重新请求整个文档,或者提示用户文件可能已损坏。通过合理处理416错误,可以提高下载的稳定性和用户体验。

资料与延伸阅读

你可以通过以下原始资料核对文中概念,并继续深入阅读。

  1. 416 Range Not Satisfiable - HTTP | MDN ↗
← 更多百度收录文章返回顶部 ↑