【问题标题】:Parsing HTTP_RANGE header in PHP在 PHP 中解析 HTTP_RANGE 标头
【发布时间】:2011-01-13 15:09:08
【问题描述】:

有没有一种方法可以在 PHP 中正确解析 HTTP_RANGE 标头?在重新发明轮子之前我想在这里问一下。

我正在使用

preg_match('/bytes=(\d+)-(\d+)/', $_SERVER['HTTP_RANGE'], $matches);

解析标头,但这并没有涵盖标头的所有可能值,所以我想知道是否有一个函数或库可以做到这一点?

提前致谢。

【问题讨论】:

标签: php apache http range http-headers


【解决方案1】:

在发送416 之前,最好使用正则表达式对其进行测试。然后通过在逗号, 和连字符- 上爆炸来解析它。我还看到您在正则表达式中使用了 \d+,但实际上 不需要。当任一范围索引被省略时,它仅表示“第一个字节”或“最后一个字节”。你也应该在你的正则表达式中涵盖它。另请参阅Range header in the HTTP spec 你应该如何处理它。

启动示例:

if (isset($_SERVER['HTTP_RANGE'])) {
    if (!preg_match('^bytes=\d*-\d*(,\d*-\d*)*$', $_SERVER['HTTP_RANGE'])) {
        header('HTTP/1.1 416 Requested Range Not Satisfiable');
        header('Content-Range: bytes */' . filelength); // Required in 416.
        exit;
    }

    $ranges = explode(',', substr($_SERVER['HTTP_RANGE'], 6));
    foreach ($ranges as $range) {
        $parts = explode('-', $range);
        $start = $parts[0]; // If this is empty, this should be 0.
        $end = $parts[1]; // If this is empty or greater than than filelength - 1, this should be filelength - 1.

        if ($start > $end) {
            header('HTTP/1.1 416 Requested Range Not Satisfiable');
            header('Content-Range: bytes */' . filelength); // Required in 416.
            exit;
        }

        // ...
    }
}

编辑:$start 必须始终小于 $end

【讨论】:

  • 不客气。免责声明:未经测试。这是从我的 Java Servlet 示例在这里或多或少地翻译过来的:balusc.blogspot.com/2009/02/…
  • 您通过分享您的 Java Servlet 实现为我节省了数小时的工作时间!非常感谢。
  • RFC specification for byte ranges 也允许像 bytes=-500 这样的东西,这是对文件最后 500 个字节的有效请求。这使得提取范围比仅仅在 - 字符上爆炸要复杂一些。
  • 这个答案是错误的,当它指出当 start 丢失时它应该被视为 0。正如 Andrew Theis 所说,当你看到类似 bytes=-500 的东西时,这是对结束的请求文件,而不是字节=0-500。
【解决方案2】:

取自PEAR Package HTTP_Download

function getRanges()
{
    return preg_match('/^bytes=((\d*-\d*,? ?)+)$/', @$_SERVER['HTTP_RANGE'], $matches) ? $matches[1] : array();
}

使用this packages 来处理这样的事情也是一个好主意!

【讨论】:

    【解决方案3】:

    fread() 页面上有一个实现 HTTP 范围支持的 sn-p:

    http://www.php.net/manual/en/function.fread.php#84115

    【讨论】:

    • 这有帮助,但它有问题。仅供参考。
    猜你喜欢
    • 1970-01-01
    • 2014-02-08
    • 2010-11-08
    • 2019-10-08
    • 2010-09-09
    • 1970-01-01
    • 2011-06-20
    • 2019-07-04
    • 2012-09-08
    相关资源
    最近更新 更多