You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 08:39:04