侧边栏壁纸

Typecho 后台「管理评论」头像不显示/显示异常,一次排坑教程(含代码)

2026年03月12日 12阅读 0评论 0点赞

 最近折腾 Typecho 主题时在后台遇到一个很“迷惑”的问题:

  • 后台 管理评论 列表里,评论者头像是一片空白圆圈,或只剩一个破图图标
  • 打开开发者工具一看,头像请求竟然是 404 Not Found

和以前的教程稍微有点区别,原教程地址“” Typecho替换Gravatar头像地址方法 。这篇文章把完整排查思路、原因和修复方法(含可直接替换的代码)整理成一篇教程,方便你一次解决。


1. 问题现象与定位方式

现象

  • 后台:管理评论 页面,作者头像加载失败
  • 刷新/清缓存也不行

如何定位(关键一步)

  1. 打开后台 管理评论 页面
  2. F12 打开开发者工具
  3. Network / 网络 里筛选 Img 或直接点击那条头像请求
  4. Request URLStatus Code

我这里抓到的是类似这种:

https://cn.cravatar.com/8e1b6515c0b950eac998a07475911655?s=40&r=G&d=mp

状态码:

404 Not Found

问题排查图
只要你也看到 404,那问题就已经很明确了:

不是 CSS、不是缓存、也不是 mp 默认头像参数不生效,而是头像源 不支持QQ的部分头像。

2. 根因:Cravatar 的正确路径必须包含 /avatar/

Cravatar(以及多数 Gravatar 镜像)请求格式通常是:

https://域名/avatar/<md5(email)>?s=大小&r=等级&d=默认

注意中间一定有:

  • **/avatar/**

而导致 404 的 URL 往往是把源写成了:

  • https://cn.cravatar.com/(少了 avatar/

这样最终拼出来就变成:

  • https://cn.cravatar.com/<hash>

当然 404。

Test

3. 正确的修复方式(修改 Typecho 核心 Common.php

后台“管理评论”的头像逻辑一般不走主题,而是走 Typecho 核心函数:

  • /var/Typecho/Common.php
  • 方法名:public static function gravatarUrl(...)

3.1 修改前务必备份

建议先备份:

cp /var/Typecho/Common.php /var/Typecho/Common.php.bak

3.2 替换为下面这份完整代码

这份代码包含:

  • QQ 邮箱:使用 QQ 头像(https,稳定)
  • 其他邮箱:使用 Cravatar 国内源(注意包含 /avatar/)
  • 没有头像时:使用 Gravatar 内置默认头像 神秘人 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);
}

4. 如何验证是否修复成功

4.1 先验证头像 URL 是否不再 404

拿一条后台 Network 里看到的头像 URL(或自己拼一个):

  • ✅ 正确(包含 /avatar/):

https://cn.cravatar.com/avatar/8e1b6515c0b950eac998a07475911655?s=40&r=G&d=mp

在浏览器直接打开,如果能返回图片(即便是默认神秘人),说明 OK。

4.2 再刷新后台

  • 刷新后台评论页
  • 或强制刷新:Ctrl + F5

头像应恢复显示。


5. 常见坑位与补充说明

5.1 为啥我加了 d=mp 还是破图?

因为:

  • d=mp 只决定“没有头像时显示什么”
  • 但你请求路径本身 404 时,根本拿不到任何图片,当然就是破图

5.2 QQ 头像建议不要用 //q2.qlogo.cn/...

很多教程喜欢写协议相对 URL(// 开头),但在一些场景(后台强制 https / 反代 / CSP)可能引发不稳定。

所以我建议直接用:https

  • https://thirdqq.qlogo.cn/g?b=qq&nk=QQ号&s=100

5.3 想配置“多个头像源自动切换”怎么办?

思路是:

  • 维护一个源数组
  • 轮询/随机挑一个

比如:

$sources = [
  'https://cn.cravatar.com/avatar/',
  'https://cravatar.cn/avatar/',
  'https://weavatar.com/avatar/',
];
$prefix = $sources[array_rand($sources)];

6. 总结

这类问题的排查核心就两步:

  1. Network 看状态码(404 就别纠结 CSS)
  2. 确认头像源是否包含正确路径(Cravatar 必须有 /avatar/

把 Typecho 核心 gravatarUrl() 修好,后台评论头像问题就能一劳永逸。


0
打赏

—— 评论区 ——

昵称
邮箱
网址
取消
人生倒计时