PDF 生成结果在 Chrome 中出现 ERR_INVALID_RESPONSE

新手上路,请多包涵

在浏览器中以编程方式(通过 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 许可协议

阅读 897
2 个回答

我要感谢大家的回答。

事实证明这与标题无关。在尝试以各种方式更改/删除标头(检测编码、尝试使用和不使用内容长度等)之后,我们决定深入研究 httpd 日志,看看是否有任何不同的 Chrome 解决方案。

事实证明,我们服务器上的 mod_sec 将请求(出于某种原因仅来自 Chrome)标记为试图进行文件注入攻击,并返回 403 禁止响应。 Chrome 将其显示为 ERR_INVALID_RESPONSE 而不是 403。

CDN 的主机名出现在请求中(我们在端点进行了充分检查以确保文件确实是允许的资源),而是在服务器上构建 URL。

原文由 Andrew Klatzke 发布,翻译遵循 CC BY-SA 3.0 许可协议

在我的例子中,我不得不 将这两个参数添加到标题 中,因为 wordpress 正在发送 404 代码,因为它无法识别我的 php 函数的 url:

 header("Content-type: application/pdf",true,200);

wordpress.stackexchange 上的此答案 所述。

这会强制标头替换(第二个参数 true )wordpress 生成的 404 状态代码,因为它无法识别自定义 url,并设置 200 OK(第三个参数 200 )。

所以它最终是这样的:

 $pdf_name = "test.pdf";
$pdf_file = "/absolute/path/to/my/pdfs/on/my/server/{$pdf_name}";
header('Content-type: application/pdf',true,200);
header("Content-Disposition: attachment; filename={$pdf_name}");
header('Cache-Control: public');
readfile($pdf_file);
exit();

原文由 Cyberdelphos 发布,翻译遵循 CC BY-SA 3.0 许可协议

推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏