我试图在PHP生成的文件中实现对内容范围的支持。当浏览器发送范围请求时,我的脚本会给出正确的字节,并且运行良好。但是,在测试从Apache服务器下载PDF时内容范围的外观时,我意识到从web浏览器到我的服务器的第一个请求不包含范围头,但是服务器仍然没有返回完整的文件,只有32 kB。
在这个屏幕截图中,您可以看到火狐向Apache发送了5个my_pdf.pdf请求,而Apache每次都使用32-192 kB进行响应。整个PDF格式为28 MB。请求2-5确实包含范围请求.但是第一个请求-突出显示没有。您可以在右边看到内容长度为28 MB,但Apache只返回32 kB。
所以我的问题是- Apache怎么知道只返回32 kB而不是整个28 MB的PDF文件?

发布于 2018-11-21 00:45:20
所以我的问题是- Apache怎么知道只返回32 kB而不是整个28 MB的PDF文件?
如果您查看响应中的内容长度标头,它显示的文件大小为2,930万字节。
客户端可能没有读取整个响应就关闭了连接。
发布于 2018-11-21 01:23:46
@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只呈现第一页)。
https://stackoverflow.com/questions/53403529
复制相似问题