WordPress 4.9.5(Divi主题)未返回404却返回相似页面问题求助
结合你使用的WordPress 4.9.5版本、Divi主题,以及「文章名称」模式的固定链接,出现这种情况主要有以下几个常见原因,对应的排查和解决方法如下:
1. WordPress核心的redirect_canonical函数自动重定向
WordPress自带的redirect_canonical函数会尝试“修正”URL——比如自动补全斜杠、纠正拼写错误,甚至将部分匹配的URL重定向到最接近的现有页面。当你访问/renew/时,它可能把这个路径识别为现有页面/renewable-energy-partnership/的前缀,触发了自动重定向逻辑。
解决方法:
- 如果你想完全禁用这个功能,可以在主题的
functions.php文件末尾添加以下代码:
remove_action('template_redirect', 'redirect_canonical');
- 注意:禁用这个函数可能影响其他正常的URL修正行为(比如重复内容的canonical处理),建议先测试,确认无副作用后再保留。
2. Divi主题的自定义查询或重定向逻辑
Divi主题本身可能内置了一些URL处理逻辑,或者你在主题设置中开启了“智能匹配”类功能。另外,如果你使用过Divi的自定义模板、全局模块,或在子主题functions.php中添加过自定义查询代码,也可能修改了默认查询规则,导致部分匹配的URL返回现有页面而非404。
解决方法:
- 先切换到WordPress默认主题(比如Twenty Seventeen),测试访问
/renew/是否返回404。如果切换后正常,说明问题出在Divi主题上。 - 进入Divi > Theme Options,检查是否有URL重定向、搜索匹配相关的设置(尤其是SEO或URL优化类选项),尝试关闭后再测试。
- 若你在子主题中添加过自定义代码,排查是否有修改
WP_Query或重写规则的内容,暂时注释掉这些代码再验证。
3. 固定链接重写规则冲突或.htaccess配置错误
当固定链接设置为「文章名称」模式时,WordPress会生成对应的重写规则写入.htaccess文件。如果.htaccess规则不正确,或与服务器其他重写规则冲突,可能导致URL解析异常,出现部分匹配的情况。
解决方法:
- 登录WordPress后台,进入设置 > 固定链接,无需修改任何设置,直接点击「保存更改」,让WordPress重新生成正确的重写规则到
.htaccess。 - 检查
.htaccess文件内容,确保WordPress的重写规则标准。「文章名称」模式的标准.htaccess内容如下:
# BEGIN WordPress <IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] </IfModule> # END WordPress
- 若服务器是Nginx,需检查Nginx配置文件中的重写规则,确保所有非静态文件请求都转发到
index.php处理。
4. 第三方插件的干扰
比如SEO插件(Yoast SEO、All in One SEO Pack)、重定向插件(Redirection)或自定义URL插件,可能设置了模糊匹配的重定向规则,或修改了WordPress的查询逻辑,导致访问不存在的URL时跳转到相似页面。
解决方法:
- 暂时禁用所有第三方插件,测试访问
/renew/是否返回404。如果恢复正常,再逐个启用插件,定位出问题插件。 - 检查重定向插件的规则列表,看是否存在包含
/renew/的模糊匹配规则(比如正则表达式^/renew),删除这类规则即可。 - 查看SEO插件设置,是否开启了“自动修复URL”或“相似页面重定向”功能,尝试关闭后测试。
5. 页面slug的部分匹配查询
WordPress查询系统默认是精确匹配slug,但如果有自定义代码修改了WP_Query参数(比如将name设为模糊匹配,或用s搜索参数处理URL),就可能导致输入部分slug时返回包含该字符串的页面。
解决方法:
- 排查主题或插件中是否有修改
WP_Query的代码,比如在pre_get_posts钩子中添加了$query->set('s', $requested_slug);这类代码——它会把URL路径当成搜索关键词,返回匹配页面。 - 找到这类代码后,修改或删除它,确保查询是精确匹配slug而非模糊搜索。
内容的提问来源于stack exchange,提问作者Jim

