REST api 接口中,有段代码返回404,但是没有正常返回错误json:
$wp_response = new \WP_REST_Response(array('error'=>'没有找到数据'));
$wp_response->set_status(404);
return $wp_response;
返回内容是:
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx</center>
</body>
</html>
这个问题非常典型,通常不是你的 PHP 代码写错了,而是 Nginx 服务器配置 拦截了 WordPress 返回的 404 状态。
要解决这个问题,你需要检查并修改 Nginx 的配置文件。以下是详细的排查和修复步骤:
核心解决方案:修改 Nginx 配置
你需要确保 Nginx 将所有请求(包括 404 状态的请求)都交给 WordPress 的 index.php 处理,而不是由 Nginx 自己处理。
-
进入宝塔面板:
- 点击左侧菜单的 “网站”。
- 找到你的站点,点击右侧的 “设置”。
- 点击左侧的 “配置文件”(注意:不是“伪静态”)。
-
查找并注释掉
error_page:
- 在配置代码中搜索
error_page 404。
- 你通常会看到类似下面的一行代码(通常在
#ERROR-PAGE-START 和 #ERROR-PAGE-END 之间):
error_page 404 /404.html;
- 操作:在这一行前面加一个
# 号把它注释掉,或者直接删除这一行。
#error_page 404 /404.html;
- 保存配置。
-
检查
location / 配置(关键):
- 确保你的配置中包含标准的 WordPress 伪静态规则,特别是
try_files 指令。
- 检查
location / { ... } 块是否包含以下内容:
location / { try_files $uri $uri/ /index.php?$args; }
- 如果没有,请在 “伪静态” 设置中选择
wordpress 规则,或者手动补全。
-
重启 Nginx:
- 修改配置后,点击宝塔面板左侧的 “软件商店” -> “运行环境” -> 找到 Nginx -> 点击 “重启”,或者在终端执行
bt 13 选择重启 Nginx。 验证修复
修改完 Nginx 配置并重启后,再次使用 Postman 或浏览器访问你的接口:
- 预期结果:你应该能看到你的 JSON 数据
{"error":"没有找到数据"},同时状态码为 404。
- 如果仍然失败:请检查你的 PHP 代码中,
new \WP_REST_Response 的注册路由是否正确,确保请求确实进入了你的回调函数(可以在函数第一行加 error_log('test'); 查看 PHP 错误日志,确认代码是否被执行)。
文章版权声明
index.php 处理,而不是由 Nginx 自己处理。进入宝塔面板:
- 点击左侧菜单的 “网站”。
- 找到你的站点,点击右侧的 “设置”。
- 点击左侧的 “配置文件”(注意:不是“伪静态”)。
查找并注释掉
error_page:- 在配置代码中搜索
error_page 404。 - 你通常会看到类似下面的一行代码(通常在
#ERROR-PAGE-START和#ERROR-PAGE-END之间):error_page 404 /404.html; - 操作:在这一行前面加一个
#号把它注释掉,或者直接删除这一行。#error_page 404 /404.html; - 保存配置。
检查
location / 配置(关键):- 确保你的配置中包含标准的 WordPress 伪静态规则,特别是
try_files指令。 - 检查
location / { ... }块是否包含以下内容:location / { try_files $uri $uri/ /index.php?$args; } - 如果没有,请在 “伪静态” 设置中选择
wordpress规则,或者手动补全。
重启 Nginx:
- 修改配置后,点击宝塔面板左侧的 “软件商店” -> “运行环境” -> 找到 Nginx -> 点击 “重启”,或者在终端执行
bt 13选择重启 Nginx。 验证修复
{"error":"没有找到数据"},同时状态码为 404。new \WP_REST_Response 的注册路由是否正确,确保请求确实进入了你的回调函数(可以在函数第一行加 error_log('test'); 查看 PHP 错误日志,确认代码是否被执行)。
