WordPress 的 REST API 功能虽然强大,但默认情况下会暴露大量接口,比如用户列表、文章信息、评论数据等。这些接口不仅容易被爬虫抓取,还可能被恶意脚本利用进行暴力破解或信息收集。对于普通网站来说,大部分 REST API 接口都是无用的,屏蔽它们可以有效减少服务器负载,提升安全性。下面是一套完整的操作流程,从识别接口到彻底关闭,每一步都附带具体代码和操作位置。
**前置准备**
- 一台已经安装好 WordPress 的服务器(无论是虚拟主机还是 VPS 均可)
- 可以访问 WordPress 后台(管理员账号)
- 准备一个代码编辑器(记事本也可以,但推荐 Notepad++ 或 VS Code)
- 准备好 FTP 工具或服务器文件管理器(用于修改主题文件或插件文件)
- 如果网站使用了缓存插件,操作完成后需要清空缓存
**分步操作步骤**
**1. 确认当前 REST API 接口状态**
在动手屏蔽之前,先搞清楚你的网站到底暴露了哪些接口。打开浏览器,在地址栏输入你的网站域名,后面加上 `/wp-json/wp/v2/`,例如 `https://你的域名.com/wp-json/wp/v2/`。如果页面返回一堆 JSON 格式的数据,说明 REST API 默认是开启的。继续查看具体路径,比如 `https://你的域名.com/wp-json/wp/v2/users` 会显示注册用户信息,`https://你的域名.com/wp-json/wp/v2/posts` 会显示文章列表。这些就是需要屏蔽的目标。如果你的网站不需要 REST API 功能(比如纯展示型网站、企业官网、博客),可以直接全局禁用;如果部分功能依赖 REST API(比如某些前端编辑器、移动端 App 接口),则采用按需屏蔽的方式。这一步的目的是让你心里有数,知道哪些接口是危险的。
**2. 通过代码彻底禁用 REST API(全局屏蔽)**
这是最彻底的方法,适合绝大多数不需要 REST API 的网站。打开 WordPress 后台,进入“外观” -> “主题文件编辑器”。在右侧文件列表中找到 `functions.php`(你的当前主题函数文件)。注意:修改前建议先复制一份原文件内容到本地备份。在 `functions.php` 文件的末尾,`?>` 标签之前(如果没有 `?>` 标签,直接在最末尾),粘贴以下代码:
```
// 彻底禁用 REST API
add_filter('rest_enabled', '__return_false');
add_filter('rest_jsonp_enabled', '__return_false');
// 移除 REST API 相关头部信息
remove_action('xmlrpc_rsd_apis', 'rest_output_rsd');
remove_action('wp_head', 'rest_output_link_wp_head');
remove_action('template_redirect', 'rest_output_link_header');
```
这段代码做了三件事:第一行关闭 REST API 主功能,第二行关闭 JSONP 跨域请求,后面三行移除页面头部和 HTTP 响应头中泄露的 REST API 链接。保存文件后,刷新你的网站前台页面,然后再次访问 `https://你的域名.com/wp-json/wp/v2/`,此时应该返回 404 或 403 错误,表示接口已失效。如果网站前台出现白屏或报错,说明你的主题或某个插件依赖 REST API,需要进入下一步“按需屏蔽”方案。
**3. 按需屏蔽特定高危接口(保留核心功能)**
如果全局禁用导致网站功能异常,比如古腾堡编辑器无法加载、某些插件报错,那么采用精准屏蔽策略。继续在 `functions.php` 文件末尾追加以下代码(保留上一步的代码不要删除,或者将上一步代码替换为以下代码):
```
// 按需屏蔽 REST API 接口
add_filter('rest_endpoints', function($endpoints) {
// 屏蔽用户列表接口(最危险)
if (isset($endpoints['/wp/v2/users'])) {
unset($endpoints['/wp/v2/users']);
}
if (isset($endpoints['/wp/v2/users/(?P
unset($endpoints['/wp/v2/users/(?P
}
// 屏蔽评论接口(防止垃圾评论和暴力破解)
if (isset($endpoints['/wp/v2/comments'])) {
unset($endpoints['/wp/v2/comments']);
}
// 屏蔽文章修订版本接口(泄露草稿信息)
if (isset($endpoints['/wp/v2/revisions'])) {
unset($endpoints['/wp/v2/revisions']);
}
// 屏蔽分类和标签接口(可选,如果不需要)
// if (isset($endpoints['/wp/v2/categories'])) {
// unset($endpoints['/wp/v2/categories']);
// }
// if (isset($endpoints['/wp/v2/tags'])) {
// unset($endpoints['/wp/v2/tags']);
// }
return $endpoints;
});
```
这段代码通过 `rest_endpoints` 过滤器,在接口注册时动态移除指定路由。注释掉的部分你可以自行决定是否启用。保存文件后,测试前台页面是否正常(比如文章编辑、菜单管理、插件配置页面)。同时再次访问 `https://你的域名.com/wp-json/wp/v2/users`,应该返回空数组或错误,而 `https://你的域名.com/wp-json/wp/v2/posts` 可能仍然可用(如果你没有屏蔽文章接口)。如果某个插件依赖被屏蔽的接口,你可以在代码中只保留危险接口的屏蔽,比如只屏蔽用户和评论接口。
**4. 使用插件屏蔽 REST API(适合不熟悉代码的用户)**
如果你不想修改代码,或者担心操作失误导致网站崩溃,可以安装插件。进入 WordPress 后台 -> “插件” -> “安装插件”,搜索“Disable REST API”。找到“Disable REST API”这个插件(作者是“WPExperts”),点击安装并启用。启用后进入“设置” -> “Disable REST API”,你会看到三个选项:完全禁用、仅禁用未认证用户、仅禁用特定路由。推荐选择“仅禁用未认证用户”,这样登录后的管理员仍然可以使用 REST API(比如古腾堡编辑器),而外部访客无法调用任何接口。如果你确定网站不需要任何 REST API 功能,直接选择“完全禁用”。保存设置后,同样测试前台和后台功能是否正常。插件方案的优点是操作简单、风险低,缺点是增加了一个插件占用资源。如果你追求极致性能,建议还是用代码方案。
**常见问题**
**Q:屏蔽 REST API 后,古腾堡编辑器无法加载,怎么办?**
A:古腾堡编辑器严重依赖 REST API,如果你使用了代码全局禁用,编辑器会白屏。解决方案:改用经典编辑器插件(安装“Classic Editor”插件),或者切换到代码按需屏蔽方案,保留 `/wp/v2/posts`、`/wp/v2/blocks` 等核心接口。具体操作:在步骤3的代码中,只屏蔽用户和评论接口,不要屏蔽文章相关接口。
**Q:屏蔽 REST API 后,网站速度没有明显提升?**
A:REST API 对速度的影响通常体现在被恶意频繁调用时。如果你网站本身访问量不大,屏蔽后可能感觉不到变化。建议配合缓存插件(如 WP Rocket、W3 Total Cache)一起使用,同时检查服务器日志,看是否有大量 `/wp-json` 的请求。如果日志中显示很多 404 请求,说明屏蔽生效,恶意请求被拦住了。
**Q:使用插件屏蔽后,某些插件报错“REST API 不可用”?**
A:这种情况通常是因为该插件在后台或前台使用了 REST API 进行数据交互。解决方法:在插件设置中选择“仅禁用未认证用户”,这样管理员登录后接口仍然可用。如果插件必须在前台调用接口(比如某个前端提交表单插件),则需要在该插件的代码中添加认证机制,或者放弃屏蔽该接口。
**Q:如何验证 REST API 是否被成功屏蔽?**
A:最直接的方法:使用浏览器无痕模式(或未登录状态)访问 `https://你的域名.com/wp-json/wp/v2/users`。如果返回 `{"code":"rest_no_route","message":"无路由匹配。","data":{"status":404}}` 或者直接显示 403 禁止访问,说明屏蔽成功。如果返回用户列表 JSON 数据,说明屏蔽失败。另外,可以用在线工具(如站长工具)模拟 GET 请求测试。
**收尾总结**
屏蔽 WordPress REST API 是安全优化中成本最低、效果最明显的一步。通过上述操作,你至少可以阻止 90% 的自动化恶意请求,防止用户信息泄露和暴力破解。如果你选择了代码方案,记得每次更新主题后检查 `functions.php` 是否被覆盖(建议使用子主题,或者在主题更新后重新添加代码)。如果你选择了插件方案,定期检查插件是否更新,防止兼容性问题。最后,建议将 REST API 屏蔽与以下措施结合:禁用 XML-RPC、修改默认管理员用户名、安装防火墙插件(如 Wordfence)。这样你的 WordPress 网站安全性会提升一个档次。