Laravel如何实现主域名与子域名项目存储路径映射
不需要修改
config/path.php,仅调整管理后台项目的config/filesystems.php配置,配合基础权限校验即可实现需求,改动范围小且不会干扰两个项目的正常运行。
前置准备
- 确认两个项目归属同一个服务器账号,共享主机下同个cPanel账号创建的站点默认满足该条件,保证后台项目的PHP进程对主站
/home/onomy/public_html/storage目录有读写权限即可;若遇权限报错将该目录权限设为755,禁止设置777权限避免安全风险。 - 提前进入主站项目根目录(
/home/onomy/public_html)执行php artisan storage:link命令,生成storage目录到public目录的软链接,确保后续上传的文件可以通过主站域名正常访问。
具体配置操作
只需要修改部署在/home/onomy/portal目录下的管理后台项目的config/filesystems.php文件,找到负责存储公开上传文件的public磁盘配置,将默认指向后台自身目录的存储根路径、访问地址替换为主站的对应绝对路径即可:
// 框架默认public磁盘配置参考 'public' => [ 'driver' => 'local', 'root' => storage_path('app/public'), 'url' => env('APP_URL').'/storage', 'visibility' => 'public', 'throw' => false, ], // 修改后的配置 'public' => [ 'driver' => 'local', 'root' => '/home/onomy/public_html/storage/app/public', 'url' => 'https://example.com/storage', 'visibility' => 'public', 'throw' => false, ],
修改完成后进入后台项目根目录执行php artisan config:clear清除配置缓存,后续后台调用Storage::disk('public')完成的所有上传、读取操作,都会直接写入主站的存储目录,生成的文件访问地址也会自动使用主站域名,可直接在前台调用。
如果有私有文件存储需求,单独在filesystem配置里新增一个磁盘,root指向主站storage下对应的非公开目录即可,不要修改默认的local磁盘配置,避免框架自身生成的临时文件存错位置。
不要修改config/path.php的原因
config/path.php是Laravel框架用来定义自身运行基础路径的配置文件,里面存储的是框架缓存、日志、会话、编译视图等核心运行文件的路径规则。如果修改这个文件里的storage相关配置,会导致后台项目所有运行时生成的临时文件、缓存、会话数据全写入主站目录,轻则出现路径找不到的报错,重则两个项目的缓存、登录会话互相覆盖,直接导致后台登录状态异常、功能报错。
仅修改filesystem中的业务磁盘配置,只会影响你上传的业务文件存储位置,框架自身的运行路径完全不受影响,稳定性更高。
常见异常处理
如果配置完成后出现open_basedir restriction类报错,是共享主机默认开启了目录访问限制,只需要到主机面板的PHP配置页面,将/home/onomy/public_html/storage路径加入open_basedir的允许访问列表即可解决。
内容的提问来源于stack exchange,提问作者akif akram

