Laravel文件上传后访问图片出现404错误求助
排查图片访问404问题的步骤
根据你提供的信息,文件已上传到服务器但访问返回404,可按以下步骤逐一排查:
1. 确认目标文件实际存在
你通过ls -ila列出的文件是4CBU96b0Ec7HHD7q7wt0T6MhPiK.jpg和9LxUUR5UnwST7y1XItgdORNevyy.jpg,但你尝试访问的是d3QCvZT8DilZm7qQ5moHMJa1jeC.jpg。先执行命令确认该文件是否真的存在于目标目录:
ls -ila /home/server/website/site/public/images/covers/d3QCvZT8DilZm7qQ5moHMJa1jeC.jpg
如果文件不存在,说明PHP代码没有成功写入该文件,需要检查代码逻辑。
2. 核对Web根目录映射
多数Web应用会将public目录设为Web根目录,也就是说服务器上的/home/server/website/site/public/对应访问路径的根目录https://www.example.com/,而非带/public/的路径。尝试访问:https://www.example.com/images/covers/d3QCvZT8DilZm7qQ5moHMJa1jeC.jpg
如果能访问,说明你之前的URL多了public前缀。
3. 检查目录权限链
虽然你给目录设置了chmod -R 777,但Web服务器的运行用户(如www-data、apache)可能无法访问父目录。用以下命令检查路径每一层的权限:
namei -l /home/server/website/site/public/images/covers/d3QCvZT8DilZm7qQ5moHMJa1jeC.jpg
确保每一层目录都对Web服务器用户有读权限。
4. 修复PHP代码逻辑问题
你的代码存在两个潜在问题:
- 先请求
https://example.com的地址,只有请求成功才会写入tmdb的图片,这可能导致你需要的图片因前置请求失败而未写入 - 重复调用
file_get_contents,且没有错误日志,无法排查写入失败原因
修改代码增加错误日志:
$posterPath = $media['poster_path']; $tmdbUrl = 'https://image.tmdb.org/t/p/original/' . $posterPath; $posterContent = file_get_contents($tmdbUrl); if ($posterContent !== false) { $savePath = '/home/server/website/site/public/images/covers/' . $posterPath; $writeResult = file_put_contents($savePath, $posterContent); if ($writeResult === false) { error_log('写入图片失败:' . $savePath); } else { error_log('图片写入成功:' . $savePath); } } else { error_log('获取TMDB图片失败:' . $tmdbUrl); }
查看服务器的PHP错误日志,确认是否有下载或写入失败的记录。
5. 检查Web服务器配置与缓存
- 查看Web服务器(Nginx/Apache)的配置文件,确认是否有重写规则将请求导向框架入口(如
index.php),导致静态文件被错误处理 - 用
curl命令直接请求URL,查看返回的详细404信息:
curl -I https://www.example.com/public/images/covers/d3QCvZT8DilZm7qQ5moHMJa1jeC.jpg
- 清除浏览器缓存后重新访问,避免缓存导致的404。
内容的提问来源于stack exchange,提问作者Julien Machin
相关产品推荐
相关产品推荐

