背景:用户报障,在华为原生浏览器访问帖子页,图片会被防盗链拦截。而在其他浏览器不会有这个问题。
防盗链的设置跟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指令创建变量,过滤并打印特定请求,如/p/12345.jpg,以分析referer信息。发现华为旧版本浏览器未携带referer,升级后问题解决,同时其他如Nokia7Plus和GOME S1的部分浏览器也有类似问题。
1072

被折叠的 条评论
为什么被折叠?



