WordPress运行于Apache环境img标签请求图片404但地址栏访问返回200
问题根因分析
从提供的请求响应日志可以看到,img标签发起的图片请求返回的404响应带WordPress的Link: https://xxx/wp-json/头,说明该请求被Apache重写规则转发到了WordPress内核处理,没有直接返回静态资源;而地址栏请求时Apache直接匹配到了静态文件返回200。核心原因大概率是以下几类:
- 动态缩略图插件异常:img标签请求的是裁剪后的尺寸缩略图,这类文件通常由WordPress缩略图插件首次访问时动态生成,若插件生成逻辑出错(目录写入权限不足、内存超限、逻辑bug),会直接返回404
- Apache内容协商配置冲突:若Apache开启了
MultiViews(内容协商)功能,会根据请求的Accept头匹配资源,img请求的Accept为image/*类时可能匹配失败,误判文件不存在触发WordPress重写 - 未公开的重写/安全规则:Apache全局配置、虚拟主机配置或隐藏的安全WAF规则,可能针对
Sec-Fetch-Dest: image、带Referer的请求做了特殊拦截,导致资源匹配失败
排查步骤
- 校验静态文件是否存在:登录服务器进入
/wp-content/gallery/media/目录,确认img标签请求的裁剪后图片文件真实存在。如果文件不存在,检查wp-content、gallery目录的写入权限,确保Web服务用户有写入权限生成缩略图 - 禁用插件排查冲突:临时禁用所有图片优化、缩略图生成、安全防护、CDN类WordPress插件,再次测试img标签请求是否正常。如果恢复正常,逐个启用插件定位冲突项
- 关闭Apache MultiViews功能:在.htaccess的
<IfModule mod_rewrite.c>块上方添加Options -MultiViews,禁用内容协商功能后重试 - 排查额外重写规则:检查Apache虚拟主机配置、全局配置中是否有针对图片请求、
Accept头、Referer头的额外重写或拦截规则,如有先临时注释测试 - 开启WordPress调试定位:修改
wp-config.php配置,开启调试日志:
define( 'WP_DEBUG', true ); define( 'WP_DEBUG_LOG', true ); define( 'WP_DEBUG_DISPLAY', false );
触发img请求的404后,查看wp-content/debug.log日志,定位具体的错误逻辑点
内容的提问来源于stack exchange,提问作者diesgomo
相关产品推荐
相关产品推荐

