WordPress移除wp-json链接(api.w.org)并按需禁用REST API:3种安全方案

为什么要移除 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。

搜索教程

建议直接搜你现在卡住的问题,比如: “产品详情页”,“谷歌收录”,“网站太慢”等。

不想自己折腾?

如果你看完几篇教程,发现还是没时间 / 没精力自己搞, 可以直接把参考站丢给我,我帮你用 WordPress 仿出一套可用的外贸官网。

滚动至顶部