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