如何解决 Typecho 由于 secure.gravatar.com 彻底被墙导致的头像显示问题

事情的起因是这样的,我给我女朋友开了一个贡献者账户,这样她就可以在我的博客下面评论(发狗粮)并且发发文章,然后她上传头像的时候发现头像显示不出来,评论的时候头像也显示不了,随后我发现我的头像在评论区也无法正常显示。我右键头像查看头像链接,发现链接好像指向了一个无法在国内正常访问的网站(被墙了),于是我上网查了查,发现这确实是个 bug ,但是很容易就可以解决

解决思路

首先我们找到 typecho/var/ 文件目录下的 common.php 文件,打开,搜索 gravatar ,你就会发现如下代码:

    /**
     * 获取gravatar头像地址
     *
     * @param string|null $mail
     * @param int $size
     * @param string|null $rating
     * @param string|null $default
     * @param bool $isSecure
     *
     * @return string
     */
    public static function gravatarUrl(
        ?string $mail,
        int $size,
        ?string $rating = null,
        ?string $default = null,
        bool $isSecure = true
    ): string {
        if (defined('__TYPECHO_GRAVATAR_PREFIX__')) {
            $url = __TYPECHO_GRAVATAR_PREFIX__;
        } else {
            $url = $isSecure ? 'https://secure.gravatar.com' : 'http://www.gravatar.com';
            $url .= '/avatar/';
        }

        if (!empty($mail)) {
            $url .= md5(strtolower(trim($mail)));
        }

        $url .= '?s=' . $size;

        if (isset($rating)) {
            $url .= '&r=' . $rating;
        }

        if (isset($default)) {
            $url .= '&d=' . $default;
        }

        return $url;
    }

很明显,secure.gravatar.com 彻底被墙之后获取这个 gravatar 头像是不可能的,但是我们注意到这样一段代码:

: string {
        if (defined('__TYPECHO_GRAVATAR_PREFIX__')) {
            $url = __TYPECHO_GRAVATAR_PREFIX__;
        } else {
            $url = $isSecure ? 'https://secure.gravatar.com' : 'http://www.gravatar.com';
            $url .= '/avatar/';
        }

如果 'TYPECHO_GRAVATAR_PREFIX' 被定义,那么 url 就会直接被赋值为 'TYPECHO_GRAVATAR_PREFIX' 从而跳过后面的代码

这样,我们的解决思路就是:编辑 typecho 目录下的 config.inc.php 在右面加上这样一段代码

// 配置头像
define('__TYPECHO_GRAVATAR_PREFIX__', 'https://cravatar.cn/avatar/');

通过国内镜像网站 cravatar.cn 获取头像并且绕过访问 secure.gravatar.com ,这样就解决了默认主题下的头像问题

修改部分主题存在的头像显示问题

虽然默认的被修改了,但是很多主题也会直接访问 secure.gravatar.com 的 API 导致头像仍然无法显示,我们可以进入控制台(admin),在修改主题那里找到评论相关的 Comment.php 文件,然后查找 secure.gravatar.com 改为 cravatar.cn 就行了

简单介绍一下 cravatar.cn

来自 cravatar.cn 的官方介绍:

Cravatar - 互联网公共头像服务

Cravatar 是 Gravatar 在中国的完美替代方案,

从此你可以自由的上传和分享头像。