在浏览器中以编程方式(通过 PHP)生成 PDF 时,呈现的 PDF 在 Firefox 和 Safari 中都可以正常显示,但 Chrome 会返回 ERR_INVALID_RESPONSE。这是一个有效的 PDF - 一旦从工作浏览器保存,就可以使用 Adobe Reader/Preview 在本地打开,甚至可以在从不同浏览器保存 PDF 后在 Chrome 中打开。
正在读取 PDF 文件 file_get_contents()
,给出当前时间戳,然后传递给浏览器。解决方法是将文件保存到临时位置并重定向用户(至少对于 Chrome),但这并不理想。
我对其进行了研究,但只能找到 2008 年的错误报告。
我知道这是标题错误。生成 PDF 后,以下标头将发送到浏览器(同样在 FF、Safari 和 IE 中正常工作):
header('Content-type:application/pdf');
header("HTTP/1.1 200 OK");
在 Stack Overflow 上搜索后,我也尝试添加以下标头,但无济于事:
header("Content-Transfer-Encoding: binary");
header('Accept-Ranges: bytes');
是否缺少 Chrome 所需的标头?有没有人有让动态生成的 PDF 在 Chrome 中显示的经验?
编辑:我最突出的问题之一是什么可能导致它在 Chrome 中本地运行良好,但在服务器环境中不起作用。
原文由 Andrew Klatzke 发布,翻译遵循 CC BY-SA 4.0 许可协议
我要感谢大家的回答。
事实证明这与标题无关。在尝试以各种方式更改/删除标头(检测编码、尝试使用和不使用内容长度等)之后,我们决定深入研究 httpd 日志,看看是否有任何不同的 Chrome 解决方案。
事实证明,我们服务器上的
mod_sec
将请求(出于某种原因仅来自 Chrome)标记为试图进行文件注入攻击,并返回 403 禁止响应。 Chrome 将其显示为ERR_INVALID_RESPONSE
而不是 403。CDN 的主机名出现在请求中(我们在端点进行了充分检查以确保文件确实是允许的资源),而是在服务器上构建 URL。