我有一个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
- 这违背了整个目的。
有谁能建议我应该做什么?感谢
答案 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