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-Since
和 If-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
就行了。
测试
不妨来做个测试吧,在下面输入您的邮箱地址,点击 显示我的头像 试试!