WordPress: 本地化gravatar头像请求以解决无法显示的问题

前些时间,http://0.gravatar.com 被墙导致 WordPress 用户头像无法显示。但 https 版本的 https://secure.gravatar.com/avatar/ 勉强可以访问, 于是大家就都切换到使用安全版本的头像链接。不过貌似又出问题了,我这里访问安全版本的gravatar也慢得不一般,没办法,只有换其它(镜像)链接了。

其实解决办法也蛮多的,国内的多说、七牛等都有gravatar头像的镜像链接,效果也不错。但我一向对他们不太敏感,说不定哪天就挂掉了(多说已挂),所以就自己想办法解决了。

正好前几天刚把服务器转到国外的vps,所以,只要把对gravatar头像的请求通过自己的站点中转一次,就能做到正确加载头像了。 但前提是:服务器在国外(除大陆以外的地区),如果您的服务器不在国外,本文的方法就无法自我满足了!

注意::要会写一点点代码才能使用如下的办法哦!

示例PHP代码

gravatar头像就是一张图片而已,使用下面的php代码+cURL转发一次即可:

<?php
$path = urldecode($_SERVER['QUERY_STRING']);
$url = 'http://www.gravatar.com/avatar/'.$path;
$headers = [];
if(isset($_SERVER['HTTP_IF_MODIFIED_SINCE']))
    $headers[] = 'If-Modified-Since: '.$_SERVER['HTTP_IF_MODIFIED_SINCE'];
if(isset($_SERVER['HTTP_IF_NONE_MATCH']))
    $headers[] = 'If-None-Match: '.$_SERVER['HTTP_IF_NONE_MATCH'];
$ch = curl_init($url);
if(count($headers)) {
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    $headers = [];
}
curl_setopt($ch, CURLOPT_HEADERFUNCTION,
    function($handle, $line) use (&$headers) {
        $headers[] = substr($line, 0, -2);
        if(strlen($line) === 2) {
            for($i=0,$c=count($headers)-1; $i<$c; $i++) {
                header($headers[$i]);
            }
        }
        return strlen($line);
    });
curl_exec($ch);
curl_close($ch);

也没几行代码,支持所有gravatar原本支持的查询参数,同样支持 If-Modified-SinceIf-None-Match 的304查询。

代码使用方式

保存为 PHP 代码文件

将上面的代码保存到网站的任意目录下,比如:根目录,命名为:avatar.php(或其它)。此时即可以 https://你的网站/avatar.php 来访问这个文件。

传递gravatar参数

gravatar原链接形式:https://secure.gravatar.com/avatar/4531b758b89c9df8e8e8a5894bed9115?s=64

包含两个有效部分。其中:4531b75... 为邮箱的 MD5,s=64 表示尺寸为 64*64

把这两部分(即/avatar/后面的部分,已用红色标注)整体URL编码后传递给上面的php代码文件即可。URL编码可以使用 JavaScript 的 encodeURIComponent

encodeURIComponent("4531b758b89c9df8e8e8a5894bed9115?s=64") 得到 4531b758b89c9df8e8e8a5894bed9115%3Fs%4D64

然后拼接起来得到:https://你的网站/avatar.php?4531b758b89c9df8e8e8a5894bed9115%3Fs%4D64 就行了。

测试

不妨来做个测试吧,在下面输入您的邮箱地址,点击 显示我的头像 试试!

您的邮箱:







发表于:2015年05月30日 ,阅读量:501 ,标签:wordpress

版权声明:若非特别注明,本站所有文章均为作者原创,转载请务必注明原文地址。