
本文介绍在共享主机环境下,让 Laravel 子域名项目(如 admin.example.com)与主域名项目(example.com)共用同一 storage 目录的方法,核心是通过自定义文件系统磁盘配置实现跨项目文件读写。
本文介绍在共享主机环境下,让 laravel 子域名项目(如 admin.example.com)与主域名项目(example.com)共用同一 `storage` 目录的方法,核心是通过自定义文件系统磁盘配置实现跨项目文件读写。
在共享主机(如 cPanel 环境)中部署多个 Laravel 应用时,常见结构为:主站(example.com)位于 /home/onomy/public_html,后台管理站点(admin.example.com)位于 /home/onomy/portal。当管理员从子域名站点上传文件时,需统一存入主站的 storage/app 和 storage/public 目录,以确保前端可直接通过 example.com/storage/... 访问;反之,子域名站点也应能正确读取该路径下的文件。
✅ 正确做法是在子域名项目(即 /portal 中的 Laravel 应用)中配置一个指向主站 storage 的自定义本地磁盘,而非修改 config/path.php(该文件仅控制 Laravel 核心路径,不涉及文件系统逻辑)。
步骤一:配置自定义磁盘(config/filesystems.php)
在子域名项目的 config/filesystems.php 的 'disks' 数组中添加新磁盘:
'public_html_storage' => [
'driver' => 'local',
'root' => '/home/onomy/public_html/storage/app', // ✅ 指向主站 storage/app
'url' => 'https://example.com/storage', // ✅ 对应主站 public/storage 的可访问 URL
'visibility' => 'public',
],
⚠️ 注意事项:
- root 必须使用绝对服务器路径,且确保 PHP 进程有读写权限(可通过 chmod 755 /home/onomy/public_html/storage 及子目录验证);
- url 值应与主站 .env 中 APP_URL=https://example.com 一致,并确保主站已运行 php artisan storage:link(即 /public_html/public/storage 是指向 /public_html/storage/app 的符号链接);
- 若主站启用了 HTTPS,请务必使用 https:// 协议,避免混合内容警告。
步骤二:使用新磁盘进行文件操作
上传文件时显式指定磁盘:
// 从子域名站点上传并保存到主站 storage
$path = $request->file('avatar')->store('avatars', 'public_html_storage');
// 生成可公开访问的 URL(返回 https://example.com/storage/avatars/xxx.jpg)
$url = Storage::disk('public_html_storage')->url($path);
读取文件同样使用该磁盘:
if (Storage::disk('public_html_storage')->exists('documents/report.pdf')) {
return response()->file(Storage::disk('public_html_storage')->path('documents/report.pdf'));
}
补充建议
- 安全性校验:生产环境务必限制子域名对 storage 的写入范围(例如通过子目录隔离:'root' => '/home/onomy/public_html/storage/app/admin-uploads'),避免误覆盖主站文件;
- 缓存刷新:修改 filesystems.php 后执行 php artisan config:clear;
- 调试技巧:使用 dd(Storage::disk('public_html_storage')->allDirectories()) 快速验证路径连通性。
通过以上配置,子域名项目即可无缝复用主站的存储空间,实现文件集中管理、CDN 统一加速和资源路径标准化,无需额外同步或复制逻辑。











