使用mPDF在生产服务器生成PDF时出现403禁止访问错误
使用mPDF生成PDF时生产服务器出现403 Forbidden错误
我尝试用PHP的mPDF库生成PDF文件,需要传入大量数据到PDF中。本地服务器运行代码完全正常,但在生产服务器执行时,网络控制台持续出现「403 Forbidden 服务器拒绝访问该资源」错误。
JS代码
$.ajax({ url: '/backend_pdfgen/pdfgen.php', type: 'POST', cache: false, data:{ "date": date_splitted[2]+" "+months[date_splitted[1]]+", "+date_splitted[0], "pos_news_table": JSON.stringify(pos_links_snaps), }, success:function(response){ window.open('backend_pdfgen/reports/'+response,"_blank"); }, complete:function(){} })
PHP代码
<?php error_reporting(E_ALL); ini_set('display_errors', 1); header('Content-Type: text/plain; charset=utf-8'); header('Access-Control-Allow-Origin: *'); header('Access-Control-Allow-Methods: POST, GET, OPTIONS'); require_once __DIR__ . '/vendor/autoload.php'; $mpdf = new \Mpdf\Mpdf(['setAutoTopMargin' => 'stretch','mode' => 'UTF-8']); $mpdf->SetTitle("Report (".$_POST["date"].")pdf"); $mpdf->SetAuthor("Me"); $mpdf->setHeader('<h1 style="text-align: center; color: rgb(50, 91, 205); font-size: 35px;"> <u>REPORT TITLE</u></h1>'); if(isset($_POST["pos_news_table"])){ $data = json_decode($_POST["pos_news_table"],true); foreach($data as $key=>$value){ $split_val = explode("**",$value); $mpdf->WriteHTML('<tr> <td style="border: 3px solid rgb(59, 84, 167); text-align:center; width:140px; height:25px; font-size: 15px;">'.$slno.'</td> <td style="border: 3px solid rgb(59, 84, 167); text-align:center; width:140px; height:25px; font-size: 15px; font-family: freeserif;">'.$split_val[2].'</td> <td style="border: 3px solid rgb(59, 84, 167); text-align:center; width:140px; height:25px; font-size: 15px; font-family: freeserif;">'.$split_val[1].'</td> <td style="border: 3px solid rgb(59, 84, 167); text-align:center; width:140px; height:25px; font-size: 15px;">'.$split_val[0].'</td> <td style="border: 3px solid rgb(59, 84, 167); text-align:center; width:140px; height:25px; font-size: 15px;">'.$split_val[4].'</td></tr>' ); } } $mpdf->Output("reports/Report (".$_POST["date"].")pdf"); echo "Report (".$_POST["date"].")pdf"; ?>
可能的原因及解决方法
- 权限配置错误:生产服务器上
backend_pdfgen/pdfgen.php文件或reports目录的权限不足,Web服务用户(如www-data)没有执行文件、写入目录的权限。检查并调整文件和目录权限,确保Web服务用户拥有对应权限。 - 安全规则拦截:生产服务器可能启用了WAF、ModSecurity等安全工具,拦截了POST请求中的JSON数据或特殊格式的文件名。查看服务器安全日志,确认是否有拦截记录,必要时调整安全规则放行该请求。
- 路径不匹配:生产服务器的目录结构与本地不一致,比如
backend_pdfgen的实际位置错误,或reports目录未创建。核对服务器上的文件路径,缺失目录及时创建。 - 跨域配置冲突:虽然代码中设置了跨域头,但生产服务器的反向代理(如Nginx)可能有额外的跨域规则,导致请求被拦截。检查服务器的跨域配置,确保允许前端域名的请求。
- 文件名特殊字符问题:生成的PDF文件名包含空格、括号等特殊字符,部分服务器会拦截这类URL。尝试将文件名改为无特殊字符的格式(比如用下划线替代空格,移除括号)。
内容的提问来源于stack exchange,提问作者user21401768
相关产品推荐
相关产品推荐

