Plesk上部署的Laravel能否跨域名调用其他站点文件返回响应?
问题解决步骤
1. 先验证open_basedir配置是否真的生效
很多时候修改Plesk配置后未生效是配置不对或者没重启服务:
- 在客户端站点根目录创建临时文件
phpinfo.php,写入内容<?php phpinfo(); ?> - 访问该文件,搜索
open_basedir字段,确认管理端站点的存储目录已经被加入允许列表 - 注意:Plesk修改配置要选对客户端站点的PHP设置项,修改完成后点击应用,若站点使用PHP-FPM模式,需要重启对应PHP版本的FPM服务才会生效,同时要确认路径拼写完全正确,Linux系统路径大小写敏感,差一个字符都不会匹配。
2. 检查文件系统权限
open_basedir仅限制PHP的路径访问范围,就算放开限制,客户端站点的运行用户没有管理端文件的读权限依然会报错:
Plesk每个站点默认分配独立的系统运行用户,所有站点用户默认归属psacln用户组,你可以在Plesk文件管理器中找到管理端站点的storage/app/public目录,右键打开权限设置,给psacln组增加读、执行权限,勾选递归应用到所有子目录和文件即可,这个方案不会对外开放额外权限,安全性较高。
3. 更安全的替代方案(无需修改服务端配置)
不想改服务配置的话可以绕过本地文件读取,改用HTTP拉取管理端文件:
- 在管理端站点开发一个带签名校验的PDF读取接口,避免未授权访问
- 客户端站点通过HTTP请求拉取PDF内容后输出给用户,代码示例:
// 客户端站点代码 $pdfContent = Http::get('https://你的管理端域名/api/get-pdf?sign=校验签名&file_id=文件ID')->body(); return response($pdfContent, 200, [ 'Content-Disposition' => 'inline; filename="'.$object->title.'.pdf', 'Content-Type' => 'application/pdf' ]);
4. Storage::response不生效的问题
Laravel的Storage::response方法默认传参是相对于对应磁盘根目录的相对路径,不要传绝对路径,你可以在客户端站点的config/filesystems.php中新增一个指向管理端存储目录的磁盘配置:
// 新增磁盘配置 'disks' => [ // 原有其他磁盘配置 'admin_public' => [ 'driver' => 'local', 'root' => '/var/www/vhosts/你的管理端域名/httpdocs/storage/app/public', ] ]
使用时调用对应磁盘即可:
return Storage::disk('admin_public')->response('myfile.pdf', $object->title.'.pdf', [ 'Content-Disposition' => 'inline' ]);
内容的提问来源于stack exchange,提问作者Matrix
相关产品推荐
相关产品推荐

