You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel public storage存储图片URL访问返回404如何解决

问题根因

这是Laravel Sail(Docker环境)下的典型软链接路径不匹配问题:在宿主机直接执行php artisan storage:link创建的软链接,指向的是宿主机本地的storage/app/public绝对路径,但响应Web请求的Nginx/PHP服务运行在Docker容器内部,容器内项目统一使用/var/www/html/作为根路径,无法识别宿主机路径格式的软链接,因此请求对应资源时返回404。宿主机下用open命令能正常打开文件,仅代表宿主机系统可识别本地路径软链接,和容器内Web服务的运行环境无关。

解决步骤
  • 先删除之前错误生成的软链接,在项目根目录执行:
rm -f public/storage
  • 所有artisan命令必须通过Sail在容器内执行,禁止直接调用宿主机本地PHP,执行存储链接创建命令:
./vendor/bin/sail artisan storage:link
  • 验证软链接有效性,进入Sail容器shell查看链接指向:
./vendor/bin/sail shell
ls -l public/storage

正常输出的链接目标应为容器内路径/var/www/html/storage/app/public,如果显示本地电脑的用户目录路径(比如/Users/xxx/code/laravel/storage/app/public),说明命令仍在宿主机执行,重新执行上一步即可。

  • 清除缓存确保配置生效:
./vendor/bin/sail artisan optimize:clear
额外排查点

执行完上述步骤仍返回404时,检查两项配置:

  1. 确认config/filesystems.php中public磁盘配置未被错误修改,默认配置如下:
'public' => [
    'driver' => 'local',
    'root' => storage_path('app/public'),
    'url' => env('APP_URL').'/storage',
    'visibility' => 'public',
    'throw' => false,
],
  1. 进入容器给目录分配正确权限,避免Web服务无文件读取权限:
./vendor/bin/sail shell
chown -R www-data:www-data public storage

注意:使用Sail环境时,所有PHP、artisan相关命令都要加./vendor/bin/sail前缀执行,宿主机与容器的环境、路径、权限差异会导致各类看似逻辑矛盾的异常。

内容的提问来源于stack exchange,提问作者PeterPan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 19:56:49