在 WordPress 中,默认的内核、主题、插件更新程序会定期请求 wordpress.org 来检查新版本,一些高级主题和插件也会请求自己的 API 服务器来验证授权码是否有效,这些请求对保证 WordPress 体验的完整性很重要,但有时候,目标服务器响应会比较慢,这些请求会拖慢WordPress页面(特别是后台页面)的打开速度,破坏 WordPress 的使用体验。
为了解决这个问题,我们可以屏蔽这些外部请求,这样就可以避免这些缓慢的请求影响WordPress的打开速度。
怎么阻止WordPress中的外部请求
WordPress 为我们提供了一个常量 WP_HTTP_BLOCK_EXTERNAL 来实现这个需求,我们只需要在 wp-config.php 中加入以下设置即可阻止所有 WordPress 外部请求。
define( 'WP_HTTP_BLOCK_EXTERNAL', true );
添加了上面的代码后,WordPress 的所有传出连接都会被阻止,包括与 wordpress.org 的连接,WordPress内核、主题和插件的更新功能都会无法使用,所以不是特别必要,尽量不要通过这种方法阻止外部请求。我们可以使用其他方法,阻止部分外部请求。
允许部分外部请求
通过 WP_ACCESSIBLE_HOSTS 常量,我们可以设置允许 WordPress 向部分域名发送请求,在这个常量中,我们可以设置多个域名,域名之间使用逗号分隔,也可使用通配符设置一组域名,示例代码如下。
define( 'WP_ACCESSIBLE_HOSTS', '*.wordpress.org,www.some-api.com' );
通过这种方式相当于为WordPress程序设置了一个外部请求域名的白名单,只有在这个白名单中的域名,才被允许被WordPress程序访问。
使用 Snitch 插件来阻止外部请求
如果您不喜欢编辑代码,更习惯用插件的方法来自定义WordPress,有一个名为 Snitch 的插件可以帮我们阻止外部请求。
如下图所示,这个插件帮我们列出了WordPress中所有的外部请求,并显示访问这个外部请求的耗时,我们可以针对性的阻止耗时特别长的外部请求。
局限性和解决办法
上面介绍的使用常量或插件来阻止外部请求的方法很方便,但是只适用于使用 WordPress 的 HTTP 类(包括 wp_remote_get,wp_remote_post 函数)请求外部资源的情况,如果使用了自定义的请求方法包括 curl 或者其他 HTTP 请求库,这种方法都会不起作用,为了最大程度的阻止WordPress访问外部资源,建议在服务器上设置防火墙来实现。