Apache和内容范围

时间:2018-11-21 00:14:39

标签: php apache http http-headers

我正在尝试在PHP生成的文件中实现对Content-Range的支持。当浏览器发送Range请求时,我的脚本给出了正确的字节,并且运行良好。 但是在测试从Apache服务器下载PDF时的Content-Range外观时,我意识到从Web浏览器向服务器发送的第一个请求不包含Range标头,但是服务器仍然不返回完整文件,只有32 kB。

在此屏幕截图上,您可以看到Firefox向Apache发送了5个关于my_pdf.pdf的请求,并且Apache每次响应均以32-192 kB响应。整个PDF为28 MB。请求2-5确实包含Range请求。但是第一个请求(突出显示)没有。您可以在右侧看到Content-Length为28 MB,但是Apache仅返回了32 kB。

所以我的问题是-Apache如何知道仅返回32 kB而不返回整个28 MB的PDF文件?

enter image description here

2 个答案:

答案 0 :(得分:1)

  

所以我的问题是-Apache如何知道仅返回32 kB而不返回整个28 MB的PDF文件?

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

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

答案 1 :(得分:0)

@duskwuff发布的答案是正确的-Firefox在足以处理PDF时终止第一个请求的传输。

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

Accept-Ranges: bytes
Content-Length: 29293315

您也可以(但不必)返回此标头:

header("Content-Range: bytes 0-29293314/29293315");   

但是默认情况下,Apache会尝试压缩PHP返回的任何内容,然后添加以下标头:

Transfer-Encoding: chunked

当Firefox(和Chrome)看到此消息时,它们将不会关闭连接。所以我只是禁用了Apache压缩,一切正常。现在,Firefox只是执行一些请求,获取少量的PDF而不是整个文件,并且可以很好地呈现第一页(因为它不需要整个PDF即可仅呈现第一页)。