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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 08:47:48