由于 GFW 的关系,使用 gravatar 的博客评论头像在国内会经常被墙,下面本文就分享几种方法来解决头像被墙问题。

调用 ssl 头像链接

https 还是没被墙的,而且速度还不错,直接调用这个最简单了。

如果你的网站启用了 ssl 则不需要了,否则

functions.php

加入如下代码

functionget_ssl_avatar($avatar){

   $avatar=preg_replace('/.*/avatar/(.*)?s=([d]+)&.*/','<img src="https://secure.gravatar.com/avatar/$1?s=$2" height="$2" width="$2">',$avatar);

   return$avatar;

}

add_filter('get_avatar','get_ssl_avatar');

本地缓存代码方案

代码缓存方案,内容摘自 WP 大学,以下是具体做法:

①、建立缓存目录

在 wp-content 的同級目录建立一个文件夹,命名为 avatar ,设置该文件夹的权限为 0755 (如果 0755 不行,就试一下 0777) 。

②、设置默认头像

准备一张大小适合的默认头像, 命名为"default.jpg" ,放在 avatar 文件夹里面。

③、添加缓存代码

将下面的代码复制到模板的 functions.php 文件中即可:

functionmy_avatar($avatar){

    $tmp=strpos($avatar,'http');

    $g=substr($avatar,$tmp,strpos($avatar,"'",$tmp)-$tmp);

    $tmp=strpos($g,'avatar/')+7;

    $f=substr($g,$tmp,strpos($g,"?",$tmp)-$tmp);

    $w=get_bloginfo('wpurl');

    $e=ABSPATH.'avatar/'.$f.'.jpg';

    $t=1209600;//設定 14 天, 單位: 秒

    if(!is_file($e)||(time()-filemtime($e))>$t){//當頭像不存在或文件超過 14 天才更新

        copy(htmlspecialchars_decode($g),$e);

    }else  $avatar=strtr($avatar,array($g=>$w.'/avatar/'.$f.'.jpg'));

        if(filesize($e)<500)copy($w.'/avatar/default.jpg',$e);

        return$avatar;

    }

add_filter('get_avatar','my_avatar');

二、插件方案

前不久,知更鸟博主鸟哥在 begin 群里分享了一款将 gavatar 头像缓存到本地的插件,个人试用了下,发现还不错,这款插件的名字就叫:nix-gravatar-cache 。貌似原版插件有点问题,鸟哥还 DIY 了一把。

如果,发现装了原版的有问题,那么就下载鸟哥改过的版本吧!

三、 Nginx 方案

我在测试这个插件的过程中,看了下生效后的头像路径,突然灵感一现:这缓存完全可以通过 Nginx 的 proxy 反向代理来缓存到本地啊!就类似于方向代理谷歌,解决被墙问题。

说干就干,经过折腾测试,发现果然好用!下面分享一下具体做法。

①、编译 Nginx

Nginx 反向代理缓存需要集成 ngx_cache_purge 模块,如果没有,则需要重新编译 Nginx,新增该缓存模块,并在 http 上下文模块中添加 proxy 缓存规则,比如:

proxy_connect_timeout5;

proxy_read_timeout60;

proxy_send_timeout5;

proxy_buffer_size16k;

proxy_buffers464k;

proxy_busy_buffers_size128k;

proxy_temp_file_write_size128k;

proxy_cache_path/tmp/cache/proxy_cache levels=1:2keys_zone=cache_one:200minactive=30dmax_size=5g;

proxy_temp_path/tmp/cache/proxy_cache/temp;

②、 Nginx 配置

在网站现有规则中加入如下规则,反向代理 gavatar 并缓存到本地:

location/avatar{

    proxy_pass http://cn.gravatar.com;

    proxy_redirect off;

    proxy_set_header Host cn.gravatar.com;

    proxy_cache cache_one;

    proxy_cache_valid200302304365d;

    proxy_cache_valid3011d;

    proxy_cache_valid any1m;

    add_header Images-Cache"$upstream_cache_status from $host";

    add_header Pragma public;

    add_header Cache-Control"public, must-revalidate, proxy-revalidate";

    access_log off;log_not_found off;expires max;

}

③、 PHP 代码

在主题目录下的 functions.php 中插入如下代码:

//更改 gavatar 来源

functionmytheme_get_avatar($avatar){

    $avatar=str_replace(array("www.gravatar.com","0.gravatar.com","1.gravatar.com","2.gravatar.com"),"www.xhsay.com",$avatar);//请修改为自己的首页域名

    return$avatar;

}

add_filter('get_avatar','mytheme_get_avatar',10,3);

即可将 WordPress 头像地址更改成自己的域名,因为头像地址二级目录字段是/avatar/,所以会匹配到我们在上一步 Nginx 新增的反向代理规则,从而从 cn.gravatar.com 拉取头像并缓存到服务器本地。

很明显这个方法支持各种建站程序 (需要修改网站代码),比 PHP 代码或插件的逼格、效率都更高!而且还不会出现外部 url 地址了!

四、折腾拓展

建议静态资源使用二级域名,并拒绝 cookies 的写入。所以本文还能继续拓展折腾一下:将头像地址改成二级域名。其实就是新增一个 server 模块而已,非常简单,感兴趣的朋友可以自己折腾一下,本文就不多做说明了。

本文资源整理自网络,部分来源为:张戈博客及 wp 大学。