Laravel共享主机部署后存储图片加载失败跳转404问题咨询
这种共享主机分离核心文件和Web根目录的部署场景我碰到过很多次,咱们一步步排查解决:
1. 先确认Web根目录的核心配置是否正确
共享主机把public_html设为Web根,你需要把Laravel原public目录里的index.php和.htaccess复制到public_html下,然后修改index.php里的路径,指向laravelapp的核心文件:
// 修改这两行的路径,替换成你实际的服务器路径 require __DIR__.'/../laravelapp/vendor/autoload.php'; $app = require_once __DIR__.'/../laravelapp/bootstrap/app.php';
这一步错了的话,不仅图片,整个站点的路由和静态资源都可能出问题。
2. 修复Storage目录的访问链接
Laravel默认通过public/storage软链接访问存储的公开文件,但现在你的Web根是public_html,得调整这个链接:
方法一:创建软链接(推荐)
如果你的主机支持SSH或文件管理器的创建链接功能,执行绝对路径的软链接命令:
ln -s /home/你的用户名/laravelapp/storage/app/public /home/你的用户名/public_html/storage
(cPanel里可以通过文件管理器查看目录的绝对路径)
方法二:修改文件系统配置(无SSH时用)
如果没法创建软链接,直接修改laravelapp/config/filesystems.php里的public磁盘配置:
'public' => [ 'driver' => 'local', 'root' => public_path('../public_html/storage'), // 直接指向public_html下的storage 'url' => env('APP_URL').'/storage', 'visibility' => 'public', ],
改完后记得清除配置缓存:能SSH就执行php artisan config:cache,不行的话就删除laravelapp/bootstrap/cache/config.php。
3. 检查你的上传代码逻辑
确保你是把图片存在public磁盘下,而不是默认的local磁盘(local磁盘存在storage/app,Web访问不到)。比如你的上传代码应该类似:
if($request->hasFile('file')){ $filenameWithExt = $request->file('file')->getClientOriginalName(); $filename = pathinfo($filenameWithExt, PATHINFO_FILENAME); $extension = $request->file('file')->getClientOriginalExtension(); $fileNameToStore = $filename.'_'.time().'.'.$extension; // 存在public磁盘 $path = $request->file('file')->storeAs('public', $fileNameToStore); // 或者用更简洁的方式 // $path = $request->file('file')->store('public'); }
上传后,图片应该出现在laravelapp/storage/app/public(软链接方式)或public_html/storage(修改配置方式)下。
4. 权限检查
确保以下目录有正确的读写权限:
laravelapp/storage及子目录:权限设为755,文件设为644public_html/storage及子目录:同样设置755权限
共享主机上如果是cPanel,右键文件/目录就能修改权限,注意不要设成777(不安全)。
5. 确认APP_URL配置
打开laravelapp/.env文件,确保APP_URL设置为你的实际域名:
APP_URL=https://你的域名.com
这样生成的图片URL才会是正确的https://你的域名.com/storage/xxx.jpg,不会出现路径错误。
按照上面的步骤一步步排查,应该就能解决图片加载404的问题了。
内容的提问来源于stack exchange,提问作者Saurabh Mistry

