Chrome浏览器中domPDF无法下载问题求助
解决Chrome中domPDF无法下载的混合内容问题
Chrome浏览器无法下载domPDF生成的文件,其他浏览器可正常使用,具体报错如下:
Mixed Content: The site at 'https://xxx.io' was loaded over a secure connection, but the file at 'https://xxx.io/pdf/?doc=auAjvjYi8yyOJIfPq3t4prhrYdWsDDxXIG85XiRyNGo' was redirected through an insecure connection. This file should be served over HTTPS. This download has been blocked. See https://blog.chromium.org/2020/02/protecting-users-from-insecure.html for more details.
相关代码
流式输出PDF的PHP代码
$domPdf = new Dompdf([ 'isRemoteEnabled' => true, ]); $domPdf->loadHtml($pdfHTML); $domPdf->setPaper('A4'); $domPdf->render(); ob_end_clean(); $domPdf->stream($documentName, [ 'compress' => true, 'Attachment' => true, ]); exit();
PDF下载链接的HTML代码
<a href="https://xxx.io/pdf?doc=auAjvjYi8yyOJIfPq3t4prhrYdWsDDxXIG85XiRyNGo" onclick="downloadPDF()" class="mobile-hide no-ul "><span class="icon-pdf"></span></a>
排查与解决方案
1. 修复服务器重定向配置
报错核心是HTTPS请求被重定向到HTTP,触发Chrome的混合内容拦截规则。需要:
- 检查服务器(Nginx/Apache)配置,确保所有HTTP请求强制跳转至HTTPS,避免出现HTTP访问路径
- 排查
pdf路由的后端逻辑,确认没有硬编码HTTP域名、或错误使用$_SERVER变量导致协议降级的情况
2. 确保资源与响应的HTTPS一致性
- 检查PDF内容中引用的外部资源(图片、CSS),全部替换为HTTPS链接,避免混合内容触发拦截
- 在输出PDF前添加安全响应头,强制浏览器使用HTTPS:
header('Content-Security-Policy: upgrade-insecure-requests'); header('Strict-Transport-Security: max-age=31536000; includeSubDomains');
3. 检查前端下载逻辑
确认downloadPDF()函数内部没有异常跳转:
- 避免函数中使用XMLHttpRequest或fetch请求HTTP协议的地址
- 如果是通过JS触发下载,确保请求的URL始终为HTTPS
4. 规范PDF输出的响应头与缓冲区处理
优化输出逻辑,避免响应头异常:
- 在
ob_end_clean()前添加ob_start(),确保缓冲区被正确清理,避免残留输出干扰 - 手动设置PDF相关响应头,明确内容属性:
header('Content-Type: application/pdf'); header('Content-Disposition: attachment; filename="' . $documentName . '"'); $domPdf->stream($documentName, [ 'compress' => true, 'Attachment' => true, ]);
内容的提问来源于stack exchange,提问作者lostbyte
相关产品推荐
相关产品推荐

