Laravel部署到虚拟主机后无法获取storage/public新上传图片
问题排查与解决步骤
旧图片能访问说明已有的软链接逻辑是通的,但新上传图片404,核心问题大概率出在新文件权限或软链接创建的上下文差异上,以下是具体排查和解决方向:
1. 检查新上传文件的权限
虚拟主机环境中,Web服务器(Apache/Nginx)的运行用户与执行上传操作的用户常存在不一致:
- 登录虚拟主机文件管理器,找到
storage/app/public/platforms_logos下的新文件,查看权限(正常应为644)和所属用户组。 - 如果文件权限是
600或者所属用户组不是Web服务器用户(如www-data),Web服务会无法读取文件,直接返回404。 - 解决方式:在上传代码中添加权限设置,或手动修改文件权限:
$file = $request->file('logo'); $filePath = $file->store('platforms_logos', 'public'); // 上传后设置文件可读权限 $fullPath = storage_path('app/public/' . $filePath); chmod($fullPath, 0644);
2. 确认软链接是否正确指向Web根目录
通过路由执行storage:link可能存在路径上下文问题:
- 部分虚拟主机的Web根目录不是项目根目录下的
public,而是public_html,此时Artisan生成的软链接会创建在项目的public目录下,但Web服务实际指向的是public_html,导致链接无效。 - 手动检查:查看Web根目录(如
public_html)下是否存在storage软链接,且指向../storage/app/public(或对应绝对路径)。 - 若不存在,手动创建软链接(支持SSH的话执行以下命令):
无SSH权限的话,可临时手动将ln -s /实际项目路径/storage/app/public /实际Web根目录/storagestorage/app/public下的新文件复制到Web根目录对应文件夹(仅临时方案,不推荐长期使用)。
3. 核对filesystems.php与.env配置
确认public磁盘的URL配置匹配虚拟主机环境:
打开config/filesystems.php,检查public磁盘配置:
'public' => [ 'driver' => 'local', 'root' => storage_path('app/public'), 'url' => env('APP_URL').'/storage', 'visibility' => 'public', ],
- 确保
.env文件中的APP_URL设置为虚拟主机的完整域名(如https://your-domain.com),避免生成的图片URL路径错误。
4. 清除配置与路由缓存
虚拟主机环境中,旧缓存可能导致配置未生效:
有SSH权限的话执行以下命令:
php artisan cache:clear php artisan config:clear
无SSH权限可临时添加路由执行清理:
Route::get('clear-cache', function () { \Artisan::call('cache:clear'); \Artisan::call('config:clear'); dd("缓存已清除"); });
内容的提问来源于stack exchange,提问作者Osama El Emam
相关产品推荐
相关产品推荐

