FPDF输出PDF串档问题求助:用户A获取到用户B的报告
问题成因
- 服务器/代理缓存误判:尽管文件名随机,但服务器或反向代理可能将动态生成的PDF识别为静态资源进行缓存,导致后续请求返回缓存的其他用户文件。
- FPDF实例复用污染:如果代码中全局复用同一个FPDF对象,没有在每个请求时重新初始化,会导致不同用户的PDF内容被混合覆盖。
- 缓存响应头缺失:未设置明确的禁止缓存HTTP头,浏览器或代理会默认缓存PDF资源,在高并发场景下可能出现缓存命中错误。
- 随机文件名冲突:若随机生成逻辑不够健壮(如仅用时间戳),高并发下可能出现文件名重复,导致文件被覆盖或混淆。
解决办法
- 每次请求初始化新的FPDF实例:避免复用全局实例,确保每个用户的PDF生成过程完全独立:
// 每个请求都创建新实例 $pdf = new FPDF(); // 生成PDF内容 $pdf->AddPage(); // ... 其他内容逻辑 $pdf->output('I', $file); - 添加强制禁止缓存的HTTP头:在输出PDF前发送缓存控制头,彻底阻止缓存:
header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0"); header("Pragma: no-cache"); header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); $pdf->output('I', $file); - 优化文件名生成逻辑:结合用户唯一标识(如用户ID)+ UUID/强随机数,确保文件名绝对唯一:
// 示例:用户ID + 唯一随机串 $uniqueId = uniqid('', true); $file = "report_{$_SESSION['user_id']}_{$uniqueId}.pdf"; - 调整服务器缓存配置:针对动态生成的PDF路径,配置服务器禁止缓存:
- Nginx配置示例:
location ~* /report_.*\.pdf$ { add_header Cache-Control "no-store, no-cache"; expires off; } - Apache .htaccess示例:
<FilesMatch "^report_.*\.pdf$"> Header set Cache-Control "no-store, no-cache, must-revalidate" Header set Expires "Sat, 26 Jul 1997 05:00:00 GMT" </FilesMatch>
- Nginx配置示例:
内容的提问来源于stack exchange,提问作者Fabian Knauf
相关产品推荐
相关产品推荐

