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时,检查两项配置:
- 确认
config/filesystems.php中public磁盘配置未被错误修改,默认配置如下:
'public' => [ 'driver' => 'local', 'root' => storage_path('app/public'), 'url' => env('APP_URL').'/storage', 'visibility' => 'public', 'throw' => false, ],
- 进入容器给目录分配正确权限,避免Web服务无文件读取权限:
./vendor/bin/sail shell chown -R www-data:www-data public storage
注意:使用Sail环境时,所有PHP、artisan相关命令都要加
./vendor/bin/sail前缀执行,宿主机与容器的环境、路径、权限差异会导致各类看似逻辑矛盾的异常。
内容的提问来源于stack exchange,提问作者PeterPan
相关产品推荐
相关产品推荐

