为什么要移除 wp-json 链接?
你在源码里看到的通常是这行:
<link rel="https://api.w.org/" href="https://example.com/wp-json/" />
它属于 WordPress REST API 的“服务发现”输出。很多站点不需要对外暴露这个提示链接,尤其是企业站/外贸站,移除它可以减少暴露面、让头部更干净(顺便少点无用输出)。但要先搞清楚一件事:移除链接≠关闭接口。你只是把“提示牌”拿走了,接口本身还在。
怎么做更合理?先选你要的“力度”
处理 wp-json 相关内容大概有三档力度:只移除页面/响应头中的链接输出;限制 REST API 仅登录用户可用;完全禁用 REST API。第一档最安全,第三档最容易误伤功能(比如区块编辑器、WooCommerce、部分插件/APP 集成)。
做什么:3种方案直接上代码
方案1(推荐):只移除 wp-json 链接输出(不影响 REST API 本体)
把下面代码加到主题 functions.php 或自定义功能插件中:
add_action('after_setup_theme', function () {
// 移除 <head> 里的 REST API 发现链接:<link rel="https://api.w.org/" ...>
remove_action('wp_head', 'rest_output_link_wp_head', 10);
// 移除 HTTP 响应头里的 Link: <.../wp-json/>; rel="https://api.w.org/"
remove_action('template_redirect', 'rest_output_link_header', 11);
});
这套做法对应社区常用解法:分别移除 wp_head 的输出和响应头的输出。它不会禁用接口,只是不再“主动告诉别人入口在哪”。
方案2:只保留登录用户可用(更偏“安全控制”,尽量不误伤后台)
如果你不希望访客调用 REST API,但又担心完全禁用会影响后台功能,可以用认证拦截:
add_filter('rest_authentication_errors', function ($result) {
if (is_user_logged_in()) {
return $result;
}
// 未登录访问 REST API 时直接拒绝
return new WP_Error('rest_forbidden', 'REST API restricted.', array('status' => 403));
});
说明:这会影响所有未登录的 REST API 请求。某些站点前端如果依赖 REST API(比如前端用 JS 拉取内容、某些缓存/统计/表单插件),会被你一刀切砍掉,动手前先确认。
方案3:完全禁用 REST API(最狠,也最可能踩坑)
如果你明确确认站点不需要 REST API(也不使用 Gutenberg/相关插件依赖),可以直接禁用:
add_filter('rest_enabled', '__return_false');
add_filter('rest_jsonp_enabled', '__return_false');
注意:官方和大量经验都在提醒“未来/部分功能可能依赖 REST API”,所以这招不保证永远无副作用。更现实一点:你客户哪天装个依赖 REST 的插件,你就得回来救火。
补充:你以为移除了,其实还在
如果你只做了方案1,访问 https://example.com/wp-json/ 仍然可能返回内容。这是正常的,因为你只是移除了“发现链接”,没有关闭端点。如果你的目标是“外部不可用”,请用方案2或3。
建议怎么选
大多数企业站/外贸站:先用方案1,风险最低、收益稳定;确实有安全合规要求再上方案2;除非你非常确定站点功能不依赖 REST API,否则别一上来就方案3。