本文约 3,168 字,预计阅读 8 分钟。文中命令与配置均经过实测,可直接参考执行。
引言
你写好一篇稿子,点”发布”或”更新”,顶部却跳出一条红字:”更新失败。与服务器通信时发生错误。”(英文是 Updating failed. The response is not a valid JSON response.)换个思路去后台装插件,同样提示”从服务器获取安装包失败”或”与服务器通信时发生错误”。奇怪的是,网站前台一切正常,文章列表、图片都能打开。这个问题几乎肯定不会让你的网站白屏,但会让你无法发文章、改设置、装插件,等于后台瘫痪。它和普通 500 错误不同,根源大多不在 WordPress 代码本身,而在 REST API 这条”后台与服务器之间的通信通道”被挡住了。本文把这条通道的原理、被挡住的常见原因和逐一排查的顺序讲清楚,跟着做基本都能定位到那一个具体的”拦路虎”。
故障原因分析
- WordPress 后台大量依赖 REST API。 现代 WordPress 的后台(古腾堡区块编辑器、站点健康、插件安装、主题预览)都通过
https://你的域名/wp-json/这类接口与服务器异步通信。通信一旦中断,前端就会抛出”不是有效的 JSON 响应”。
- 固定链接规则失效。 REST API 的地址
/wp-json/依赖伪静态重写规则。如果.htaccess被改坏、服务器没开mod_rewrite、或者刚迁移/换域名后没重新保存固定链接,/wp-json/就会返回 404 或 301,后台自然拿不到数据。
- 安全插件或服务器防火墙拦截。 Wordfence、Jetpack、部分”禁用 REST API”类插件、宝塔防火墙、Cloudflare 的 WAF 规则,都可能把
wp-json请求当成可疑流量直接拒绝,返回一个 HTML 拦截页而不是 JSON。
- 站点地址设置前后不一致。 后台”WordPress 地址(URL)”和”站点地址(URL)”如果一个是
https一个是http、或者一个是带www一个是不带,浏览器发起请求的域名和你实际能访问的域名对不上,接口就会跨域或 404。
- 接口内部报错。 某个插件或主题在 REST 接口里抛出 PHP 致命错误,服务器返回 500 或者错误页 HTML,前端解析失败,同样显示”通信时发生错误”。
分步解决方案
第一步,先做最直观的诊断: 在浏览器地址栏直接访问:
https://你的域名/wp-json/
- 如果返回一大段
{开头的 JSON 数据 → 接口本身通,问题可能在具体插件。 - 如果返回 404 页面 → 是固定链接/伪静态问题。
- 如果返回 403、验证码页、或某个安全插件的拦截页 → 是被拦截。
- 如果返回 500 或致命错误 → 是接口内部 PHP 报错。
推荐同时打开 工具 → 站点健康 → 信息,在列表里能找到”REST API”一项,WordPress 会直接告诉你接口是否可达,省去手工测试。
方法一:重新保存固定链接(最常见有效)
进入后台 设置 → 固定链接,把选项随便切成”朴素”再切回”文章名”,然后点”保存更改”。这个动作会重新写入重写规则,多数情况下 /wp-json/ 立刻恢复。
如果后台也进不去,可以直接手动检查根目录 .htaccess 是否包含 WordPress 标准规则:
# .htaccess(WordPress 根目录)
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
规则被破坏时,先备份原文件,再把上面这段恢复成默认内容。
方法二:临时停用安全/防火墙类插件定位拦截源
用 FTP 或在后台依次停用安全插件(Wordfence、iThemes Security、Wordfence、以及名字里带”Disable REST API””REST API 管控”的插件),每停一个就回到编辑器试一次保存。
如果停用后恢复正常,说明就是它在拦截,正确做法不是长期停用,而是把 /wp-json/ 路径加入白名单,或恢复编辑器的 REST 请求权限。宝塔面板可以进入 网站 → 防火墙 → URL 白名单,把 /wp-json 加进去;Cloudflare 则在 Security → WAF 里新建例外规则放行。
方法三:统一站点地址
进入 设置 → 常规,确认”WordPress 地址(URL)”和”站点地址(URL)”完全一致,且协议(http/https)、域名(是否带 www)与你实际访问的地址相同。改不了的,可以在 wp-config.php 里强制写死:
// wp-config.php,写在 "/* That's all, stop editing! */" 这一行之前
define( 'WP_HOME', 'https://mimangfei.com' );
define( 'WP_SITEURL', 'https://mimangfei.com' );
方法四:打开调试日志看真实报错
在 wp-config.php 中开启日志:
// wp-config.php
define( 'WP_DEBUG', true );
define( 'WP_DEBUG_LOG', true );
define( 'WP_DEBUG_DISPLAY', false );
然后重试保存文章,查看 wp-content/debug.log。如果里面有某个插件文件的 PHP Fatal error,基本就是它导致接口 500,针对性升级或停用该插件即可。
常见踩坑点
- 只测首页就下结论。 首页正常不代表接口正常,一定要单独访问
/wp-json/验证。 - 把安全插件永久关掉。 排查时临时停用可以,但长期关闭会让网站暴露风险,正确姿势是加白名单。
- 忽略 CDN 缓存。 Cloudflare 等 CDN 可能缓存了
/wp-json/的旧响应,改完设置后要清一次 CDN 缓存再测。 - 改了固定链接却忘记保存。 只切换选项不点”保存更改”,重写规则不会刷新。
WP_DEBUG一直开着。 排查完记得关掉或至少保持WP_DEBUG_DISPLAY为 false,否则前台会暴露服务器路径信息。- 忽略主机层面的 mod_security。 有些主机默认开启的 WAF 规则会拦截含特定参数的 REST 请求,遇到 403 可以联系主机客服放行。
总结
“与服务器通信时发生错误”翻译成人话就是:后台发出的请求,没有收到一份合格的 JSON 响应。所以排查方向非常明确——先访问 /wp-json/ 看接口通不通,再按”固定链接是否失效、安全插件是否拦截、站点地址是否一致、接口是否 500″的顺序逐层缩小范围。多数站长按本文的顺序操作,最快的一步往往就是重新保存一次固定链接,或者把 /wp-json 加进防火墙白名单。修好之后建议顺手打开调试日志确认没有残留的 PHP 报错,并给后台换一个稳定的网络环境测试,避免把偶发的网络波动误判成服务器故障。
