商品列表里的图片时好时坏,URL 通常落在 /media/catalog/product/cache/...。这个目录是派生产物,404 可能是原图不存在、PHP 无法写入、Nginx 没把缺失图片交给 Magento 生成,也可能是 WebP 扩展或 CDN 改写了后缀。

拿一条失败 URL 反查原图

curl -skI 'https://shop.example.com/media/catalog/product/cache/abc123/r/e/red-shirt.jpg'
find pub/media/catalog/product -path '*/r/e/red-shirt.jpg' -ls
stat pub/media/catalog/product/r/e/red-shirt.jpg
file pub/media/catalog/product/r/e/red-shirt.jpg

数据库有文件名但磁盘无原图,resize 不可能成功。共享媒体或对象存储站点要在 PHP 节点验证,不能只登录 Nginx 节点查看。

在维护窗口主动生成

bin/magento catalog:images:resize
tail -n 100 var/log/exception.log
find pub/media/catalog/product/cache -type f -mmin -5 | head

报 permission denied 时检查 CLI 用户与 PHP-FPM 用户是否共享组权限。不要执行 chmod -R 777 pub/media,应修正 owner、group 和目录继承策略。

namei -l pub/media/catalog/product/cache
ps -eo user,group,cmd | grep '[p]hp-fpm'
getfacl pub/media/catalog/product pub/media/catalog/product/cache | head -n 80

文件存在,HTTP 仍 404

比较 Web Server root 与 Magento pub 目录,检查 media location 是否被错误的 try_files 截断。若 URL 改成 .webp,确认转换文件实际存在。

nginx -T 2>/dev/null | grep -nE 'root |location .*/media|try_files' | head -n 80
curl -sk --resolve shop.example.com:443:10.0.0.12  'https://shop.example.com/media/catalog/product/cache/abc123/r/e/red-shirt.jpg'  -o /tmp/image.bin
file /tmp/image.bin

CDN 404 而源站 200,就刷新具体失败路径并检查是否缓存了早期 404。最后从商品列表、详情页、购物车各验证一种尺寸,因为它们的 cache key 不同。

不要把清空 cache 当作修复

删除图片 cache 只会强制重新生成。如果原图缺失、目录不可写或转换器配置错误,清空后会让原本还能访问的缓存也消失。先选一张失败图片完成端到端验证,再决定是否批量重建。