You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Wagtail出现的“not-found”类型404错误的来源是什么?

问题根因分析

你观测到的/media/not-found404日志,是Wagtail内置的媒体资源渲染降级机制导致的,对应你提出的几个疑问解释如下:

  1. 为什么真实图片请求没有出现在HTTP日志里
    Wagtail的图片渲染逻辑(包括模板{% image %}标签、StreamField块的图片渲染逻辑)会在服务端生成HTML的阶段就校验目标图片/生成的缩略图是否可访问:如果检测到文件不存在、路径不匹配、权限不足,不会把真实图片URL输出到HTML中,而是直接替换为/media/not-found占位URL。浏览器从始至终都没有发起过对真实图片的请求,因此日志里不会出现对应记录,只有替换后的/media/not-found请求日志。
  2. 为什么后台打开子页面没有报错
    Wagtail后台的图片预览、页面编辑区的媒体资源加载走的是后台专属的内部接口,只会校验数据库中的图片记录是否存在,不会触发前端页面的降级替换逻辑,只要图片的数据库记录没被删除,后台就不会抛出可见报错。
  3. 为什么实际图片没丢但还是触发了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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 13:57:05