【问题标题】:PHP response to HEAD requestPHP 对 HEAD 请求的响应
【发布时间】:2018-08-08 10:50:10
【问题描述】:

我有一个 PHP 脚本,它按字节范围提供 PDF 文件的部分内容。

如果收到 HTTP HEAD 请求,它应该发回标头(包括 PDF 文件大小),而不是实际的文件内容。我试过这个:

header('HTTP/1.1 200 OK');
header('Content-Type: application/pdf');
header('Accept-Ranges: bytes');
header('Content-Length: '.filesize($Pathname));
die;

问题是某些东西(我假设 Web 服务器 == LiteSpeed)将 Content-Length 标头替换为 Content-Length: 0 - 这违背了整个目的。

谁能建议我应该做什么?谢谢

【问题讨论】:

  • 你检查过$Pathname是否正确吗?
  • 你怎么知道它被替换了?
  • @Paul 是的 $Pathname 变量绝对正确。我还写入了一个日志文件,确认 filesize($Pathname) 是实际文件大小。
  • @BartFriederichs - 通过查看 Firefox (F12) 中的网络活动。
  • 尝试添加 header('Dummy-Length: ' .filesize($Pathname));和 header('Dummy-Exists: ' . file_exists($Pathname));

标签: php http litespeed


【解决方案1】:

来自 w3c 超文本传输​​协议 -- HTTP/1.1:

当在消息正文中给出 Content-Length 时 允许,其字段值必须与 消息体。 HTTP/1.1 用户代理必须通知用户 接收并检测到无效长度。

还有:

Content-Length entity-header 字段表示 entity-body,十进制的八进制数,发送给接收者,或者,在 在 HEAD 方法的情况下,实体主体的大小将 如果请求是 GET,则已发送。

所以,我想,如果您向服务器发送真正的 HEAD 请求,您的代码将正常工作。

【讨论】:

  • 我看不出真正的 HEAD 请求会有什么不同,因为 PHP 响应独立于初始请求,不是吗?
  • “我看不出真正的 HEAD 请求会产生什么影响” - 我可以。这无疑将责任归咎于网络服务器,而不是 PHP 或您的代码(假设您在响应 HEAD 请求时得到相同的行为)。
  • @oomp 试一试。您可以使用 curl -i -D -I -X HEAD http://yourserver.com(http:// 和域名之间没有空格)或 Postman
  • 谢谢——感谢@symcbean——你是对的。谁会相信为了响应 HEAD 请求,您需要一个 HEAD 请求?我现在觉得有点傻。
【解决方案2】:

正如 Lurii 所说,内容长度受您的请求类型影响。

对于 GET 请求,不匹配的内容长度可能会导致客户端挂起,因此 LiteSpeed 将在将标头发送到客户端之前验证内容长度。

使用 HEAD 请求应按预期返回内容长度。

【讨论】:

    【解决方案3】:

    这是网络服务器的工作,不是你的。

    在我的例子中,我把所有东西都留给了 Apache 网络服务器,除了如何解析请求之外,我的 php 代码没有任何变化

    例如

    if($_SERVER['REQUEST_METHOD'] === "GET"){
         //ok
    }else{
         //send 400 Bad Request
    }
    

    改为

    if($_SERVER['REQUEST_METHOD'] === "GET" || $_SERVER['REQUEST_METHOD'] === "HEAD"){
         //ok
    }else{
         //send 400 Bad Request
    }
    

    Apache 完成了所有繁重的工作(对响应正文进行了条纹处理)。

    (不要尝试ob_clean()die("") 或类似的东西)。

    相关资源:

    http://hc.apache.org/httpclient-3.x/methods/head.html

    https://security.stackexchange.com/questions/62811/should-i-disable-http-head-requests

    Apache 2.2.2 response on HEAD requests

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-17
      • 1970-01-01
      相关资源
      最近更新 更多