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访问日志过滤

 

你可能感兴趣的:(nginx,Nginx,访问日志,过滤)