Laravel中如何从子域名配置主域名的存储路径
Laravel子域名跨域访问文件问题解决方案
1. 确保存储目录共享与权限
- 两个域名对应的Laravel项目必须共用同一物理存储目录,比如都指向服务器上的
/var/www/storage/app/public。如果是独立部署的项目,可通过挂载共享存储或创建软链接实现文件共享。 - 检查服务器目录权限,确保运行项目的用户(如www-data)对该存储目录拥有读写权限。
2. 配置跨域资源共享(CORS)
主域和子域属于不同源,浏览器会拦截跨域资源请求,需在子域名项目中配置CORS规则:
- 安装CORS扩展包:
composer require fruitcake/laravel-cors - 修改
config/cors.php,允许主域名访问:return [ 'paths' => ['api/*', 'storage/*'], 'allowed_origins' => ['https://etest.com'], 'allowed_methods' => ['GET', 'POST', 'OPTIONS'], 'allowed_headers' => ['*'], 'max_age' => 3600, 'supports_credentials' => false, ]; - 在
app/Http/Kernel.php的API中间件组中注册CORS中间件:protected $middlewareGroups = [ 'api' => [ \Fruitcake\Cors\HandleCors::class, // 其他原有中间件 ], ];
3. 统一文件访问URL
- 子域名项目上传文件时,配置存储磁盘使用子域名的绝对URL:
修改config/filesystems.php:'disks' => [ 'public' => [ 'driver' => 'local', 'root' => storage_path('app/public'), 'url' => 'https://recovey-test.com/storage', 'visibility' => 'public', ], ]; - 主域名后台直接使用子域名返回的完整文件URL(如
https://recovey-test.com/storage/avatar.jpg)展示文件,确保前端请求路径正确。
4. 生成存储目录软链接
两个项目都需执行以下命令,创建存储目录到public目录的软链接:
php artisan storage:link
确保软链接指向的是同一物理存储目录,避免文件不同步。
5. 调试验证
- 直接在浏览器访问子域名的文件URL,确认文件可正常打开。
- 在主域名页面加载文件,打开浏览器控制台查看是否有跨域错误,根据提示调整CORS配置或URL路径。
内容的提问来源于stack exchange,提问作者NilshaniCJ
相关产品推荐
相关产品推荐

