最近折腾 Typecho 主题时在后台遇到一个很“迷惑”的问题:
和以前的教程稍微有点区别,原教程地址“” Typecho替换Gravatar头像地址方法 。这篇文章把完整排查思路、原因和修复方法(含可直接替换的代码)整理成一篇教程,方便你一次解决。
F12 打开开发者工具Img 或直接点击那条头像请求我这里抓到的是类似这种:
https://cn.cravatar.com/8e1b6515c0b950eac998a07475911655?s=40&r=G&d=mp
状态码:
404 Not Found
只要你也看到 404,那问题就已经很明确了:
不是 CSS、不是缓存、也不是 mp 默认头像参数不生效,而是头像源 不支持QQ的部分头像。
/avatar/Cravatar(以及多数 Gravatar 镜像)请求格式通常是:
https://域名/avatar/<md5(email)>?s=大小&r=等级&d=默认
注意中间一定有:
**/avatar/**而导致 404 的 URL 往往是把源写成了:
https://cn.cravatar.com/(少了 avatar/)这样最终拼出来就变成:
https://cn.cravatar.com/<hash>当然 404。

Common.php)后台“管理评论”的头像逻辑一般不走主题,而是走 Typecho 核心函数:
/var/Typecho/Common.phppublic static function gravatarUrl(...)建议先备份:
cp /var/Typecho/Common.php /var/Typecho/Common.php.bak这份代码包含:
mp把你原来的 gravatarUrl() 整个替换成:
// 替换为QQ头像源及 Gravatar 国内头像源(无头像显示神秘人 mp)
public static function gravatarUrl($mail, $size, $rating, $default, $isSecure = false)
{
$mail = trim((string)$mail);
$size = (int)$size;
// QQ 邮箱:QQ 头像(https)
if (preg_match('/^\d{5,11}@[qQ][Qq]\.(com)$/', $mail)) {
$qq = substr($mail, 0, strpos($mail, '@'));
$s = $size > 0 ? $size : 100;
return "https://thirdqq.qlogo.cn/g?b=qq&nk={$qq}&s={$s}";
}
// 其他邮箱:Cravatar(注意:必须包含 /avatar/)
if (defined('__TYPECHO_GRAVATAR_PREFIX__') && __TYPECHO_GRAVATAR_PREFIX__) {
$prefix = rtrim(__TYPECHO_GRAVATAR_PREFIX__, '/') . '/';
} else {
$prefix = 'https://cn.cravatar.com/avatar/';
// 也可用:'https://cravatar.cn/avatar/'
// 备选:'https://weavatar.com/avatar/';
// 备选:'https://gravatar.helingqi.com/wavatar/';
}
$hash = $mail !== '' ? md5(strtolower($mail)) : '';
$default = 'mp'; // 神秘人
return $prefix . $hash
. '?s=' . ($size > 0 ? $size : 80)
. '&r=' . $rating
. '&d=' . urlencode($default);
}拿一条后台 Network 里看到的头像 URL(或自己拼一个):
/avatar/):https://cn.cravatar.com/avatar/8e1b6515c0b950eac998a07475911655?s=40&r=G&d=mp
在浏览器直接打开,如果能返回图片(即便是默认神秘人),说明 OK。
Ctrl + F5头像应恢复显示。
d=mp 还是破图?因为:
d=mp 只决定“没有头像时显示什么”//q2.qlogo.cn/...很多教程喜欢写协议相对 URL(// 开头),但在一些场景(后台强制 https / 反代 / CSP)可能引发不稳定。
所以我建议直接用:https
https://thirdqq.qlogo.cn/g?b=qq&nk=QQ号&s=100思路是:
比如:
$sources = [
'https://cn.cravatar.com/avatar/',
'https://cravatar.cn/avatar/',
'https://weavatar.com/avatar/',
];
$prefix = $sources[array_rand($sources)];这类问题的排查核心就两步:
/avatar/)把 Typecho 核心 gravatarUrl() 修好,后台评论头像问题就能一劳永逸。
—— 评论区 ——