Laravel生产环境符号链接已存在但项目中找不到问题解决
核心问题分析
存储链接路径配置错误
你的filesystems.php中links配置项不符合Laravel默认逻辑:'links' => [ base_path('storage') => storage_path('app/public'), ],Laravel标准配置是
public/storage软链指向storage/app/public,而你配置的是项目根目录下的storage文件夹作为链接目标,这直接导致软链创建位置错误,无法实现Web访问。文件上传到非公开磁盘
上传代码使用$image->storeAs()时未指定磁盘,默认使用local磁盘(根目录为storage/app),文件存在storage/app/upload/...路径下,但软链指向的是storage/app/public,所以即使软链正常,也无法通过Web访问这些文件。软链"已存在"但不可见的原因
- 之前创建的软链是断链(目标路径异常或权限不足),部分文件系统会隐藏断链;
- 生产环境服务器权限限制,导致你无法看到软链;
- 共享主机环境下,服务商可能禁止根目录级软链或隐藏软链。
分步解决步骤
1. 修正软链配置
修改filesystems.php的links项为标准配置:
'links' => [ public_path('storage') => storage_path('app/public'), ],
2. 清理错误软链
在生产环境服务器执行命令,删除之前错误创建的软链:
rm -f /path/to/your/project/storage
替换
/path/to/your/project为项目实际路径,可通过pwd命令查看当前根目录。
3. 重新创建正确软链
执行Artisan命令生成标准存储软链:
php artisan storage:link
若public目录下看不到storage,可通过以下命令验证软链是否存在:
ls -la public/
输出中若出现storage -> ../storage/app/public条目,说明软链创建成功。
4. 修正上传代码,存储到公开磁盘
修改上传代码,指定使用public磁盘存储,文件会自动保存到storage/app/public目录:
// 指定public磁盘存储文件 $path = $image->storeAs($directory, $filename, 'public');
视图中显示图片时,使用Laravel内置方法生成访问URL:
<img src="{{ Storage::url($sliderImage->image_path) }}" alt="Slider Image">
5. 迁移已上传文件(可选)
若之前已有文件存于storage/app/upload/...,手动将文件移动到storage/app/public/upload/...,并确保数据库中image_path字段路径与新位置匹配。
额外注意事项
- 确保
storage/app/public和public/storage的权限为755,用户组设置为Web服务器用户(如www-data); - 共享主机无法创建软链时,可手动在
public目录创建storage文件夹,然后在.htaccess添加重写规则:RewriteRule ^storage/(.*)$ ../storage/app/public/$1 [L] - 验证访问:上传新文件后,直接访问
https://your-domain.com/storage/upload/sliders/images/xxxx/xx/filename.jpg,检查是否正常显示。
内容的提问来源于stack exchange,提问作者Pouya Vaghefi

