nginx上匹配特定請求,並打印日誌

背景:用戶報障,在華爲原生瀏覽器訪問帖子頁,圖片會被防盜鏈攔截。而在其他瀏覽器不會有這個問題。

防盜鏈的設置跟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等手機上的部分瀏覽器也會有這個問題。

 

參考資料:

Nginx Map的使用

Nginx訪問日誌過濾

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章