Wagtail出现的“not-found”类型404错误的来源是什么?
问题根因分析
你观测到的/media/not-found404日志,是Wagtail内置的媒体资源渲染降级机制导致的,对应你提出的几个疑问解释如下:
- 为什么真实图片请求没有出现在HTTP日志里
Wagtail的图片渲染逻辑(包括模板{% image %}标签、StreamField块的图片渲染逻辑)会在服务端生成HTML的阶段就校验目标图片/生成的缩略图是否可访问:如果检测到文件不存在、路径不匹配、权限不足,不会把真实图片URL输出到HTML中,而是直接替换为/media/not-found占位URL。浏览器从始至终都没有发起过对真实图片的请求,因此日志里不会出现对应记录,只有替换后的/media/not-found请求日志。 - 为什么后台打开子页面没有报错
Wagtail后台的图片预览、页面编辑区的媒体资源加载走的是后台专属的内部接口,只会校验数据库中的图片记录是否存在,不会触发前端页面的降级替换逻辑,只要图片的数据库记录没被删除,后台就不会抛出可见报错。 - 为什么实际图片没丢但还是触发了not-found替换
大概率是页面缓存了旧的渲染结果:你修复图片路径/恢复图片文件之前,页面已经被缓存了带/media/not-found的HTML版本,即使后续文件恢复,旧缓存没有被清空的情况下,依然会返回带占位URL的内容。
排查解决步骤
- 先校验核心配置:确认
settings.py中MEDIA_ROOT为绝对路径,和图片实际存储的根路径完全一致;MEDIA_URL和站点配置的媒体资源路由前缀匹配,同时确认反向代理(Nginx/Apache等)的媒体资源路由规则没有截断路径。 - 校验图片Rendition记录:查询数据库
wagtailimages_rendition表中对应图片的记录,取出file字段存储的相对路径,拼接MEDIA_ROOT后检查对应路径的文件是否存在、运行Django的进程是否有该文件的读权限。 - 清空全链路缓存:依次清空Django站点缓存、CDN缓存、页面片段缓存,重新发布对应页面后再访问,确认是否恢复正常。
- 调试降级触发逻辑:临时修改
wagtail/images/templatetags/wagtailimages_tags.py中的图片渲染逻辑,在触发not-found替换的分支增加日志输出,打印触发替换的图片ID、文件路径、异常信息,即可定位到具体问题图片和触发原因。
关联日志
[25/Aug/2021 20:28:53] "GET /static/wagtailadmin/images/bg-dark-diag.svg HTTP/1.0" 200 700 Not Found: /media/not-found [25/Aug/2021 20:29:18] "GET /media/not-found HTTP/1.0" 404 3252
内容的提问来源于stack exchange,提问作者AlMo320
相关产品推荐
相关产品推荐

