Php Apache和内容范围

Php Apache和内容范围,php,apache,http,http-headers,Php,Apache,Http,Http Headers,我试图在PHP生成的文件中实现对内容范围的支持。当浏览器发送范围请求时,我的脚本给出了正确的字节,并且运行良好。 但在测试从Apache服务器下载PDF时内容范围的外观时,我意识到从web浏览器到我的服务器的第一个请求不包含范围头,但不知何故,服务器仍然不返回完整文件,并且仅返回32 kB 在这个屏幕截图上,您可以看到Firefox向Apache发送了5个my_pdf.pdf请求,Apache每次都以32-192 kB的大小响应。整个PDF是28MB。请求2-5不包含范围请求。但突出显示的第一个

我试图在PHP生成的文件中实现对内容范围的支持。当浏览器发送范围请求时,我的脚本给出了正确的字节,并且运行良好。 但在测试从Apache服务器下载PDF时内容范围的外观时,我意识到从web浏览器到我的服务器的第一个请求不包含范围头,但不知何故,服务器仍然不返回完整文件,并且仅返回32 kB

在这个屏幕截图上,您可以看到Firefox向Apache发送了5个my_pdf.pdf请求,Apache每次都以32-192 kB的大小响应。整个PDF是28MB。请求2-5不包含范围请求。但突出显示的第一个请求没有。您可以在右侧看到,内容长度为28MB,但Apache仅返回32KB

所以我的问题是-Apache怎么知道只返回32KB而不是整个28MB的PDF文件

所以我的问题是-Apache怎么知道只返回32KB而不是整个28MB的PDF文件

没有。如果查看响应中的Content Length标头,它将显示2930万字节的完整文件大小


客户端可能在没有读取整个响应的情况下关闭了连接。

由@Dashwuff发布的答案是正确的-Firefox一旦获得足够的数据来处理PDF,就会终止第一批请求的传输

下面是我发现的一些细节。 如果脚本返回以下标题,Firefox将终止:

Accept-Ranges: bytes
Content-Length: 29293315
您还可以(但不必)返回此标题:

header("Content-Range: bytes 0-29293314/29293315");   
Transfer-Encoding: chunked
但是,默认情况下,Apache尝试压缩PHP返回的任何内容,然后添加以下标题:

header("Content-Range: bytes 0-29293314/29293315");   
Transfer-Encoding: chunked
当Firefox(和Chrome)看到这一点时,他们不会关闭连接。所以我禁用了Apache压缩,一切正常。现在Firefox只需要执行一些请求,获取一些PDF文件,而不是整个文件,并且可以很好地呈现第一页(因为它不需要整个PDF文件来呈现第一页)