PHP从数据库读取路径存储的PDF并在页面展示及403权限报错解决
问题原因定位与解决方法
第一步:排查403错误核心原因
- 首先检查PDF文件与所属目录的系统权限:Linux环境下Web服务运行用户(常见为www-data、apache、nginx)需要有PDF文件的读权限,目录权限至少设置为
755,PDF文件权限至少设置为644,不建议使用777权限避免安全风险。 - 检查Web服务的访问规则:Apache环境下查看PDF存储目录下是否有
.htaccess设置了禁止访问规则,Nginx环境下查看站点配置是否对对应路径配置了deny规则,多数站点会默认禁止访问私有存储目录的静态资源。 - 检查输出到前端的路径格式:不要输出服务器本地物理路径(例如
/var/www/html/xxx.pdf),需要输出Web可访问的相对路径或者站点绝对URL(例如./upload/xxx.pdf或者https://你的域名/upload/xxx.pdf),直接输出物理路径必然会触发403或者404错误。
第二步:PHP读取展示PDF的实现方案
场景1:直接嵌入PDF到页面
如果PDF存储目录已经开放Web访问权限,直接用嵌入标签加载即可,示例代码如下:
<?php // 数据库连接、查询逻辑已省略,假设查询结果存储在$row变量中 $pdf_path = $row['pdf_path']; // 数据库存储的是Web可访问的相对路径,例:upload/2024/aaa.pdf $pdf_name = $row['pdf_name']; $other_field = $row['other_field']; ?> <!-- 嵌入PDF展示 --> <iframe src="<?php echo htmlspecialchars($pdf_path); ?>" width="100%" height="800px" title="<?php echo htmlspecialchars($pdf_name); ?>"></iframe> <p>文档名称:<?php echo htmlspecialchars($pdf_name); ?></p> <p>其他字段:<?php echo htmlspecialchars($other_field); ?></p>
提示:对输出内容做htmlspecialchars()转义可以避免XSS安全漏洞
场景2:不暴露PDF真实路径(更安全的方案)
如果不想将PDF存储目录暴露到公网,可以用PHP做一层代理读取,数据库存储PDF的本地物理路径即可,不会出现403权限问题。
首先新建代理文件show_pdf.php,代码如下:
<?php // 可在这里添加用户权限校验逻辑,例如判断是否登录、是否有该PDF的访问权限 $pdf_id = intval($_GET['id']); // 数据库连接、根据$pdf_id查询PDF物理路径的逻辑已省略,假设查询到的物理路径为$real_path $real_path = '/var/www/private_pdf/xxx.pdf'; if (!file_exists($real_path)) { header("HTTP/1.1 404 Not Found"); exit('文件不存在'); } // 输出PDF对应的响应头 header('Content-Type: application/pdf'); header('Content-Disposition: inline; filename="' . basename($real_path) . '"'); header('Content-Length: ' . filesize($real_path)); // 清空缓冲区避免输出多余内容 ob_clean(); flush(); // 输出PDF文件内容 readfile($real_path); exit; ?>
前端页面嵌入时直接调用代理地址即可:
<iframe src="show_pdf.php?id=<?php echo $pdf_id; ?>" width="100%" height="800px"></iframe>
内容的提问来源于stack exchange,提问作者Johnson
相关产品推荐
相关产品推荐

