PHP 响应 HEAD 请求

PHP response to HEAD request

我有一个 PHP 脚本,可以按字节范围提供 PDF 文件的各个部分。

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

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

问题是某些东西(我假设网络服务器 == LiteSpeed)用 Content-Length: 0 替换了 Content-Length header - 这违背了整个目的。

任何人都可以建议我应该做什么吗?谢谢

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

When a Content-Length is given in a message where a message-body is allowed, its field value MUST exactly match the number of OCTETs in the message-body. HTTP/1.1 user agents MUST notify the user when an invalid length is received and detected.

并且:

The Content-Length entity-header field indicates the size of the entity-body, in decimal number of OCTETs, sent to the recipient or, in the case of the HEAD method, the size of the entity-body that would have been sent had the request been a GET.

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

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

对于 GET 请求,non-matching 内容长度可能会导致客户端挂起,因此 LiteSpeed 会在将 header 发送到客户端之前验证内容长度。

使用 HEAD 请求应该 return 内容长度符合预期。

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

在我的例子中,我将所有内容都留给了 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