由於 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 大學。