如何解决 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 在中国的完美替代方案,
从此你可以自由的上传和分享头像。