Warning: preg_match(): Unknown modifier '{' in /www/wwwroot/jovz.cn/wp-content/plugins/parsedown-wp/parsedown-wp.php on line 170
最近,我给 WordPress 网站接入了腾讯云 EdgeOne。网站访问和静态资源加载都很正常,但 OneNav 主题自带的「AI 网址抓取填充」功能开始频繁报错:
Failed to execute 'json' on 'Response':
Unexpected end of JSON input
接入 EdgeOne 之前,这项功能基本没有出过问题。接入后,AI 生成经常执行到一半中断,而且失败的位置并不固定。
一开始看到 JSON input,很容易认为是 AI 接口返回了错误 JSON,或者 WordPress 输出了 PHP 警告。但经过排查发现,真正的问题不是 JSON,而是 EdgeOne 在 WordPress 完成处理之前终止了请求。
最终解决方法是:为 /wp-admin/admin-ajax.php 单独设置不缓存,并把 EdgeOne 的回源应答超时调整为 120 秒。
问题是怎么产生的
OneNav 的 AI 网址抓取会根据输入的网址,自动执行多个步骤:
抓取网页
→ 获取图标
→ 获取截图
→ 生成标题
→ 生成摘要
→ 生成正文
→ 生成标签
→ 生成 SEO 信息
前端会分步向 WordPress AJAX 接口发送 POST 请求:
/wp-admin/admin-ajax.php
后端收到请求后,需要抓取目标网页、下载远程资源或调用 AI 接口,然后返回 JSON。前端再通过类似下面的代码读取结果:
response.json()
问题在于,这些步骤都不是普通的快速请求。
目标网站访问速度、图片下载速度和 AI 接口响应时间都不稳定,某些请求可能持续几十秒。在我的网站上,完整生成过程大约需要 50 秒。
当网站没有接入 CDN 时,浏览器会直接等待源站处理完成。接入 EdgeOne 后,请求链路变成了:
浏览器
→ EdgeOne
→ WordPress 源站
→ 目标网站或 AI 接口
如果 WordPress 还没有返回结果,EdgeOne 就已经达到回源应答超时限制,边缘节点会停止等待并返回错误。
不要被 JSON 报错误导
Unexpected end of JSON input 并不一定表示服务器返回了格式错误的 JSON。
它也可能表示响应体是空的。
例如,前端执行:
JSON.parse('')
就会得到相同错误。
因此,看到这类报错后,不应该只检查 AI 返回内容或 PHP 输出,还应该打开浏览器开发者工具,查看真实的 HTTP 请求。
操作方法:
- 按
F12打开开发者工具; - 切换到 Network;
- 重新执行 AI 网址抓取;
- 找到失败的
admin-ajax.php请求; - 查看 Status、Response 和请求耗时。
检查后发现,失败请求的状态码是:
524
这才是真正的线索。
524 的含义
524 通常表示边缘节点已经连接到源站,但源站没有在规定时间内返回 HTTP 应答。
本次问题的完整链路是:
OneNav 发起 AI 抓取请求
→ WordPress 开始抓取网页或调用 AI
→ 单次处理时间较长
→ EdgeOne 等待源站应答超时
→ EdgeOne 返回 524
→ 响应体为空或不是预期 JSON
→ 前端继续调用 response.json()
→ 出现 Unexpected end of JSON input
因此,浏览器显示的是 JSON 解析错误,真正的根因却是 CDN 回源超时。
这也解释了为什么问题不是每次都出现:如果目标网站和 AI 接口响应较快,请求就能在超时前完成;如果某一步响应稍慢,就会触发 524。
EdgeOne 规则配置
解决办法是在 EdgeOne 规则引擎中,为 WordPress AJAX 接口建立专用规则。
进入:
腾讯云 EdgeOne 控制台
→ 站点加速
→ 规则引擎
→ 创建规则
匹配条件设置为:
HOST 等于 updh.cn
AND
URL path 等于 /wp-admin/admin-ajax.php
如果网站有多个域名,或者不想让规则受到 Host 影响,也可以只匹配:
URL path 等于 /wp-admin/admin-ajax.php
我的 www 域名已经通过 301 跳转到主域名,后台实际请求使用的是主域名,因此不需要额外加入 www。
接下来添加三个操作。
1. 浏览器缓存 TTL
设置为:
不缓存
2. 节点缓存 TTL
同样设置为:
不缓存
admin-ajax.php 返回的是动态数据,不应该作为普通静态内容缓存。即使 POST 请求通常不会被正常缓存,明确配置不缓存也更稳妥。
3. 回源超时时间
设置:
HTTP 应答超时时间:120 秒
我的 AI 生成过程大约需要 50 秒,120 秒能够留出足够余量。即使目标网站或 AI 接口偶尔变慢,也不至于立即被 EdgeOne 截断。
保存并发布规则后,再次运行 AI 抓取,原来的 524 和 JSON 解析错误都不再出现。
一个容易忽略的配置错误
我最初设置规则时,还加入了一个文件后缀条件:
HOST 等于 updh.cn
AND
URL path 等于 /wp-admin/admin-ajax.php
AND
文件后缀等于 css、js
这条规则看起来没有明显问题,实际上永远无法命中 admin-ajax.php。
原因是:
/wp-admin/admin-ajax.php
它的文件后缀是 php,不可能同时满足「文件后缀是 CSS 或 JS」。
EdgeOne 中的这些匹配条件是 AND 关系,必须同时成立。即使操作区域已经设置了 120 秒回源超时,只要规则没有命中,配置就不会生效。
正确做法是删除文件后缀条件,只保留:
HOST 等于 updh.cn
AND
URL path 等于 /wp-admin/admin-ajax.php
或者仅保留 URL path。
这个细节也提醒我:使用 CDN 规则引擎时,不仅要检查下面的操作是否正确,还必须确认上面的条件是否真的能同时成立。
修改后如何验证
规则发布后,可以重新打开浏览器 Network 面板,再执行一次 AI 抓取。
重点检查:
admin-ajax.php是否还返回 524;- 请求是否能等待 50 秒左右正常完成;
- Response 是否返回完整 JSON;
- 前端是否能继续执行后续生成步骤。
如果状态码变成 200,响应体正常,并且整套 AI 流程可以完成,就说明规则已经命中并生效。
如果仍然超时怎么办
EdgeOne 只是整个请求链路中的一层。
即使 EdgeOne 愿意等待 120 秒,如果源站自身在 60 秒时终止 PHP 请求,浏览器仍然拿不到结果。
如果调整 EdgeOne 后依旧失败,还需要检查以下配置。
PHP 执行时间
检查:
max_execution_time
它必须高于实际处理时间。AI 生成需要约 50 秒时,PHP 最大执行时间至少不能低于 50 秒,建议保留一定余量。
Nginx 超时时间
如果源站使用 Nginx 和 PHP-FPM,需要检查:
fastcgi_read_timeout
如果前面还有反向代理,还要检查:
proxy_read_timeout
其他代理层
如果网站还经过负载均衡、宝塔反向代理或其他网关,也要检查相应的读取超时。
比较合理的关系是:
实际业务处理时间
<
源站 Web 服务器超时时间
≤
EdgeOne 回源应答超时时间
任何一层提前终止请求,都可能导致前端收到空响应。
代码侧还可以改进什么
虽然这次通过 EdgeOne 配置解决了问题,但 OneNav 前端直接调用 response.json() 的容错能力比较有限。
更稳妥的方式是先检查 HTTP 状态码和响应体:
const text = await response.text();
if (!response.ok) {
throw new Error(`请求失败:HTTP ${response.status}`);
}
if (!text.trim()) {
throw new Error('服务器返回了空响应');
}
const data = JSON.parse(text);
这样遇到 524、502、504 或空响应时,可以显示更明确的错误信息,而不是统一表现为 JSON 解析失败。
还可以针对偶发的网络问题增加一两次自动重试。不过,重试不能替代正确的超时设置。如果业务处理需要 50 秒,而 CDN 只允许等待 15 秒,那么重试多少次都会失败。
总结
这次问题的排查过程可以概括为:
接入 EdgeOne
→ OneNav AI 抓取频繁报 JSON 解析错误
→ 检查 admin-ajax.php 网络请求
→ 发现状态码为 524
→ 确认 EdgeOne 回源应答超时
→ 为 admin-ajax.php 设置不缓存
→ 将回源应答超时调整为 120 秒
→ 删除冲突的 CSS、JS 后缀条件
→ AI 抓取恢复正常
遇到 Unexpected end of JSON input 时,不要只盯着 JSON 格式。
这个错误真正说明的是:前端没有拿到可正常解析的 JSON。原因可能是 PHP 报错,也可能是 502、504、524,甚至只是一个空响应。
最有效的排查方法,是直接查看 Network 中的状态码和响应内容。
如果状态码是 524,并且接口正在执行 AI 生成、网页抓取、批量导入等耗时任务,就应该优先检查 CDN、反向代理和 Web 服务器的超时设置。
对于 WordPress 网站,为 /wp-admin/admin-ajax.php 单独建立「不缓存 + 延长回源超时」规则,通常比让它沿用普通页面或静态资源的加速策略更加可靠。