欢迎光临
我们一直在努力

记一次关于WordPress站点健康提示REST API错误及解决办法

首先我们开看看什么是REST API?

WordPress REST API为WordPress数据类型提供API端点,允许开发人员通过发送和接收JSON(JavaScript对象符号)对象远程与站点进行交互。 JSON是一种开放标准的数据格式,它是轻量级和可读的,看起来像是在JavaScript中的对象; 由此得名。 当您向API发送内容或发出请求时,将以JSON返回响应。 这使开发人员能够从客户端JavaScript或外部应用程序创建,阅读和更新WordPress内容,甚至是用PHP语言编写的内容。

简单的说就是通过这个 REST API 可以很轻松的获取网站的数据,可应用于其他网站、手机 APP 或小程序等;但对于一般的网站是没有需要的,反而会拖累网站的速度,而且 REST API 采用 GET 请求方式,这就为 DDOS 攻击提供了一个新的攻击途径,所以我们应尽可能的禁止掉这些不必要的功能需求,并且去掉 head 里面输出 wp-json 链接。

WP 站点健康状态

既然他报错了,我们先来看看接口是否正常开启。查看 WP JSON REST API 是否开启的方法:

http://域名/wp-json/,若输出数据则是开启状态。

WP JSON REST API状态

有数据输出说明接口正常开启,由于我们用不到REST API接口,所以接下来我们需要关闭这个功能。如果我们想兼容所有版本的 WordPress,我们可以直接使用插件Disable REST APIDisable WP REST API来完全禁用 REST API;但我更倾向纯代码的方法,在这里就介绍下代码版兼容所有 WordPress 版本的完全禁用 REST API 或者说移除 head 里面 wp-json 链接的方法。

将下面的代码添加到当前主题函数模板 functions.php 中:

/*
 * 屏蔽 REST API
 */
add_filter('json_enabled', '__return_false');
add_filter('json_jsonp_enabled', '__return_false');
add_filter('rest_enabled', '__return_false');
add_filter('rest_jsonp_enabled', '__return_false');
// 移除头部wp-json标签与HTTP header中的link
remove_action('wp_head', 'rest_output_link_wp_head', 10);
remove_action('template_redirect', 'rest_output_link_header', 11);
add_filter('rest_authentication_errors', 'demo_disable_rest_api');
function demo_disable_rest_api($access)
{
    return new WP_Error('rest_disabled', __('The REST API on this site has been disabled.'), ['status' => rest_authorization_required_code()]);
}

我们再来看看WP JSON REST API 是否已经关闭。

WP JSON REST API关闭状态
如图WP JSON REST API已经成功关闭了

关闭接口之后我们会发现在健康状态栏依然会有这2个报错。没关系,我们继续!

站点健康功能,用于了解当前网站运行中有哪些问题需要改进,位置在WP后台→工具→站点健康。
该功能源自 Site Health Tool Manager 插件,也就是插件的简化版。

为什么要集成网站健康检测功能,据说是为开发人员方便测试,有人说很有用,个人认为没有任何用处,暴露主机环境信息,另外不知道这玩意是否经常自己在后台偷偷运行检测,还是打开后再执行检测,试过一次就再也不想打开。

可以通过下面的方法有选择性地禁止某些项目检测或者禁止全部项目检测。

将下面的代码添加到当前主题函数模板 functions.php 中:

//禁用 PHP 版本检测,示例:
function prefix_remove_site_health( $tests ) {
	unset( $tests['direct']['php_version'] );//禁止PHP检测
	return $tests;
}
add_filter( 'site_status_tests', 'prefix_remove_site_health' );

通过site_status_tests过滤器,返回时触发WP_Site_Health::get_tests()

注:$tests是一个数组。包括$tests['direct']$tests['async'],在加载站点健康状态之前,直接测试在 PHP 中运行,并且在页面加载之后通过 Ajax 调用触发异步测试。

禁用更多功能检测请对照: /wp-admin/includes/class-wp-site-health.php

例如:

unset( $tests['direct']['php_version'] );//禁止PHP检测
 
unset( $tests['direct']['wordpress_version'] );//禁止程序版本检测
 
unset( $tests['direct']['plugin_version'] );//禁止插件版本检测

一行一个,以此类推。

禁止全部代码:

/*
 * 屏蔽 健康状态检测
 */
function prefix_remove_site_health( $tests ) {
	unset( $tests['direct']['php_version'] );
	unset( $tests['direct']['wordpress_version'] );
	unset( $tests['direct']['plugin_version'] );
	unset( $tests['direct']['theme_version'] );
	unset( $tests['direct']['sql_server'] );
	unset( $tests['direct']['php_extensions'] );
	unset( $tests['direct']['php_default_timezone'] );
	unset( $tests['direct']['php_sessions'] );
	unset( $tests['direct']['utf8mb4_support'] );
	unset( $tests['direct']['https_status'] );
	unset( $tests['direct']['ssl_support'] );
	unset( $tests['direct']['scheduled_events'] );
	unset( $tests['direct']['http_requests'] );
	unset( $tests['direct']['is_in_debug_mode'] );
	unset( $tests['direct']['dotorg_communication'] );
	unset( $tests['direct']['background_updates'] );
	unset( $tests['direct']['loopback_requests'] );
	unset( $tests['direct']['rest_availability'] );
	return $tests;
}
 
add_filter( 'site_status_tests', 'prefix_remove_site_health' );

检测项全部禁止后,你会看到 站点健康 检测结果显示100%,完美!

赞(4) 赏口饭吃
版权声明:本文采用知识共享 署名4.0国际许可协议 [BY-NC-SA] 进行授权
文章名称:《记一次关于WordPress站点健康提示REST API错误及解决办法》
文章链接:https://vckers.com/notes/32.html
本站资源仅供个人学习交流,请于下载后24小时内删除,不允许用于商业用途,否则法律问题自行承担。
分享到: 更多 (0)

评论 1

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

微客网络

真的勇士永不止步

觉得文章有用就打赏一下文章作者

非常感谢你的打赏,我们将继续给力更多优质内容,让我们一起创建更加美好的网络世界!

支付宝扫一扫打赏

微信扫一扫打赏