背景:用戶報障,在華爲原生瀏覽器訪問帖子頁,圖片會被防盜鏈攔截。而在其他瀏覽器不會有這個問題。
防盜鏈的設置跟referer相關。一開始想的是通過手機連接fiddler代理,觀察圖片請求帶的referer是什麼。但因爲觸屏版用了https,而同事手上能重現此問題的華爲手機又死活安裝不上fiddler的證書,所以沒法通過fiddler來捕捉請求。
因爲訪問圖片要先經過Nginx,所以想着在Nginx上打印出其中一張圖片的訪問請求,查看其referer。但因爲訪問量有點大,不適合打出所有訪問日誌。
解決方法:
0、自定義一個訪問日誌格式;
1、通過Nginx的map,創建一個變量$loggable。該變量默認值爲0,只有$request爲特定的請求時,其值才爲1;
2、在server中配置access_log的時候,帶上if=$loggable條件。
例:只打印出/p/12345.jpg的請求,具體配置如下:
0、自定義日誌格式:
log_format mylogformat '"$remote_addr" "[$time_local]" "$request_method" '
'"$uri" "$request_uri" "$request_time" "$status" "$body_bytes_sent"'
'"$http_referer" "$http_x_forwarded_for" "$http_user_agent" "$upstream_status"'
'"$upstream_addr" "$upstream_response_time"';
1、使用map,創建並初始化變量:
map $request $loggable{
default 0;
~^GET\s/p/12345.jpg 1;
}
2、在配置access_log時,通過該變量來判定是否應該打印日誌:
server{
.../*前面的部分*/
access_log /yourPathToAccessLogFile/access.log mylogformat if=$loggable;
#mylogformat是步驟0創建的日誌格式
#access_log off; //取消註釋,就不打印訪問日誌了
.../*後面的部分*/
}
3、保存並檢查nginx.conf:
cd /pathToNginx/sbin/
./nginx -t
4、若檢查沒問題,則重啓nginx:
./nginx -s reload
最後,發現 華爲原生瀏覽器的舊版本,在請求圖片時,的確沒有帶上referer。升級到最新版本後,這個問題應該已經消除了。
另外,還發現Nokia7Plus,GOME S1等手機上的部分瀏覽器也會有這個問題。
參考資料: