内容

    服务器响应 416 Range Not Satisfiable

    HTTP 状态码 416 (范围无法满足)

    HTTP 状态码 416 表示服务器无法满足客户端请求的范围。这通常发生在客户端请求的数据部分超出了可用数据的范围。本文将详细探讨导致此状态码的原因、实际示例以及在不同编程语言中修复错误的方法。

    416 - Range Not Satisfiable

    导致状态码 416 的原因

    • 不正确的范围指定

      客户端在请求范围时可能会出现错误,例如请求的范围超过文件的实际大小。

    • 服务器上缺少数据

      在某些情况下,资源可能已被删除或更改,导致请求的范围超出可用数据。

    • 不正确的头部信息

      不正确配置的 Range 头部可能会引发此错误。

    实际示例

    1. 音频文件示例

      客户端请求超出音频文件长度的范围,以下是请求和服务器响应的示例:

      请求: GET /audio.mp3 HTTP/1.1
      Range: bytes=1000000-
      响应: HTTP/1.1 416 Range Not Satisfiable
    2. 图像示例

      请求获取部分图像,但该图像已被修改,客户端不知晓新的尺寸:

      请求: GET /image.png HTTP/1.1
      Range: bytes=0-500
      响应: HTTP/1.1 416 Range Not Satisfiable
    3. 文本文件示例

      客户端请求的文本文件范围超出实际文件的大小:

      请求: GET /document.txt HTTP/1.1
      Range: bytes=0-1000
      响应: HTTP/1.1 416 Range Not Satisfiable

    在不同编程语言中修复 416 错误

    Python(使用 requests 库)

    import requests
    
    url = "http://example.com/file.mp3"
    headers = {"Range": "bytes=1000000-"}
    response = requests.get(url, headers=headers)
    
    if response.status_code == 416:
        print("请求的范围无法满足,调整请求范围。")
    

    JavaScript(使用 Fetch API)

    fetch("http://example.com/file.mp3", {
        method: "GET",
        headers: {
            "Range": "bytes=1000000-"
        }
    })
    .then(response => {
        if (response.status === 416) {
            console.log("请求的范围无法满足,调整请求范围。");
        }
    });
    

    PHP(使用 cURL)

    $ch = curl_init("http://example.com/file.mp3");
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array("Range: bytes=1000000-"));
    $response = curl_exec($ch);
    
    if (curl_getinfo($ch, CURLINFO_HTTP_CODE) == 416) {
        echo "请求的范围无法满足,调整请求范围。";
    }
    curl_close($ch);
    

    总结

    状态码 416 表示请求的范围数据不可用。为了避免此状态,客户端应正确指定范围并妥善处理可能出现的错误。

    情况 示例请求 响应代码
    音频文件超出范围 Range: bytes=1000000- 416
    图像被修改 Range: bytes=0-500 416
    文本文件超出范围 Range: bytes=0-1000 416