【问题标题】:Is it possible to enable HTTP range request support in the PHP's built-in web server?是否可以在 PHP 的内置 Web 服务器中启用 HTTP 范围请求支持?
【发布时间】:2020-08-27 17:01:45
【问题描述】:

我正在使用 PHP 内置服务器来提供静态文件。

php -S localhost:8000

然而,我注意到 Range 标头被忽略 - 而不是提供请求的范围,而是提供整个资源。

我不是很精通 PHP,我使用这个服务器的原因是因为我正在寻找 Python 的内置服务器 (python3 -m http.server) 的替代方案,它不支持范围请求(或者?)内置在 macOS 中。在我看来,Python 和 PHP 服务器是两个可用的选项。知道 Python 不支持 HTTP 范围请求,有没有办法使用config.ini 或其他机制在 PHP 中启用 HTTP 范围请求?

我查看了php -h,但除了基本语法之外,它并没有谈论-S 选项。不确定是否有更多选项可以与它一起使用,所以我认为config.ini 是唯一可能的方法。

【问题讨论】:

  • 对我来说,我可以通过 $_SERVER 访问请求范围标头。见:stackoverflow.com/questions/157318/…
  • 但是您要请求和提供什么?内置的网络服务器被阻塞并且有限制。
  • OP 正在寻求提供静态文件,所以我认为这意味着他们希望基本上支持自动文件恢复。
  • 你能不能不用Apache,那不是另一个OSX内置的吗?
  • @Progrock 能否提供一个关于如何使用 Apache 提供静态文件的示例命令行,以便我可以测试它是否执行范围请求?

标签: php http-headers


【解决方案1】:

如果您使用路由器启动网络服务器:

$ php -S 0.0.0.0:9999 router.php

所有 http 请求都将通过该脚本传递。在那里,您可以通过读取和输出文件块来处理范围请求。

使用此评论中链接到此处的脚本: https://stackoverflow.com/a/22398156/3392762

您可以在 router.php 中尝试以下操作:

<?php
if($_SERVER['REQUEST_URI'] === '/foo.ogg')
    serveFilePartial('foo.ogg');

非常小心地将用户提交的路径映射到文件。

我无法证明链接代码的质量。但是如果你扫描它,它会寻找$_SERVER['HTTP_RANGE'] 标头。并尝试获取请求的字节范围并适当地提供一个块。

【讨论】:

  • 感谢您的好 sn-p。看起来它不会自己做,这很遗憾,但很高兴知道。
  • 可能不是默认的内置行为,但您可以轻松地使用 3rd 方代码来实现一个文件解决方案。我采用了上面的函数 serveFilePartial,并将其剪切并粘贴到一个文件中。用 jpeg 对其进行了测试,包括 null 作为第二个参数和第三个参数(jpeg 的正确内容标题),它对我有用。
【解决方案2】:

虽然我没有明确的答案,但我很确定 documentation 基本上说不。

此网络服务器旨在帮助应用程序开发。它也可用于测试目的或在受控环境中运行的应用程序演示。它并非旨在成为功能齐全的 Web 服务器。

【讨论】:

  • 文档建议您必须自己处理不受支持的 mime 类型。因此,如果您真的愿意,我会认为您可以读取标题并相应地对文件进行分块。
  • @Progrock,我同意并赞成您的回答。我假设 OP 没有在公共互联网上运行(希望如此),并且它们还只有特定的设备连接,因此关于路径遍历、脚本下载等的安全问题也不应该成为问题。
  • 确实,我只是在本地机器上使用它进行测试。
猜你喜欢
  • 2012-05-11
  • 1970-01-01
  • 1970-01-01
  • 2016-08-03
  • 2011-04-19
  • 1970-01-01
  • 2022-08-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多