当以编程方式(通过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本地工作正常,但不适用于服务器环境.
预先感谢您的任何帮助.
在我的情况下,我不得不将这两个参数添加到标题,因为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();
试试这个
... ... ...
确保在将PHP脚本输出发送到浏览器之前调用上面的标题代码.
我要感谢大家的回答.
事实证明这与标题无关.在尝试以各种方式更改/删除标头(检测编码,尝试使用和不使用内容长度等)之后,我们决定深入研究更深入的httpd日志,以查看是否有任何内容针对Chrome进行了不同的解析.
事实证明,mod_sec
在我们的服务器上标记了请求(仅出于某种原因来自Chrome)作为文件注入攻击的尝试并且返回403禁止响应.Chrome将其显示为ERR_INVALID_RESPONSE
403而不是403.
CDN的主机名存在于请求中(我们在端点上进行了充分的检查以确保该文件确实是一个允许的资源),而是在服务器上构建URL.