PHP对HEAD请求的响应

时间:2017-01-04 11:15:51

标签: php http litespeed

我有一个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: 0 - 这违背了整个目的。

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

3 个答案:

答案 0 :(得分:6)

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

  

在消息正文的消息中给出Content-Length时   允许,其字段值必须与OCTET的数量完全匹配   消息体。 HTTP / 1.1用户代理必须在何时通知用户   收到并检测到无效长度。

  

Content-Length实体标题字段指示的大小   entity-body,以十进制数字表示的OCTET,发送给收件人或者   HEAD方法的情况,即实体的大小   如果请求是GET,则已被发送。

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

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

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

就我而言,我将所有内容都留给了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