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
我有一个 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