Loading
0

关于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 JSON REST API 是否开启的方法:

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

有数据输出说明接口正常开启,由于我们用不到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已经成功关闭了

关闭接口之后我们会发现在健康状态栏依然会有这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%,就没有任何健康提示了!

文章声明:
1、本站文章来源于互联网,仅供学习交流使用,严禁用于商业用途,因此造成的一切法律后果自行承担。
2、本站不对文章内容的完整性和安全性负责,请自行辨别,如发现有问题,请及时联系我们进行处理。
3、若文章中有侵权或不适当内容,请留言告知我们,本站会第一时间进行处理。