注意user agent的坑
可以查看我的另外一篇文章:/zzhongcy/article/details/104983732
前言
对于一些网站来说,不希望国外蜘蛛来访问我的网站,特别是个别垃圾蜘蛛,它们访问特别频繁。这些垃圾流量多了之后,严重浪费服务器的带宽和资源。
通过判断user agent,在nginx中禁用这些蜘蛛可以节省一些流量,也可以防止一些恶意的访问。
判断user agent
1、进入nginx的配置目录,例如cd /usr/local/nginx/conf
2、添加agent_deny.conf配置文件 vim agent_deny.conf
加入以下
#禁止Scrapy等工具的抓取
if ($http_user_agent ~* (Scrapy|Curl|HttpClient)) {
return 403;
}
#禁止指定UA及UA为空的访问
if ($http_user_agent ~ "FeedDemon|JikeSpider|Indy Library|Alexa Toolbar|AskTbFXTV|AhrefsBot|CrawlDaddy|CoolpadWebkit|Java|Feedly|UniversalFeedParser|ApacheBench|Microsoft URL Control|Swiftbot|ZmEu|oBot|jaunty|Python-urllib|lightDeckReports Bot|YYSpider|DigExt|YisouSpider|HttpClient|MJ12bot|heritrix|EasouSpider|LinkpadBot|Ezooms|^$" )
{
return 403;
}
#禁止非GET|HEAD|POST方式的抓取
if ($request_method !~ ^(GET|HEAD|POST)$) {
return 403;
}
还有加一些针对特殊的user_agent的访问
if ($http_user_agent ~ "Mozilla/4.0\ \(compatible;\ MSIE\ 6.0;\ Windows\ NT\ 5.1;\ SV1;\ .NET\ CLR\ 1.1.4322;\ .NET\ CLR\ 2.0.50727\)") { return 404; }
这个是如何得出是频繁访问的user_agent呢,通过分析nginx的日志可以得出
tail -n 1000 /usr/local/nginx/logs/ | awk -F\" '{A[$(NF-1)]++}END{for(k in A)print A[k],k}' | sort -n | tail 分析访问次数
执行以上命令可以得出访问最多的user_agent,通过人为判断是否正常来屏蔽
判断 pc 和 mobile
# 判断 pc 和 mobile 的 H5
location / {
set $is_mobile false; #设置一个初始值
if ( $http_cookie ~* "ACCESS_TERMINAL=mobile" ) { #判断匹配手机端
set $is_mobile true;
}
if ($http_user_agent ~* (android|ip(ad|hone|od)|kindle|blackberry|windows\s(ce|phone))) {
#匹配手机端类型
set $is_mobile true;
}
if ($is_mobile = true) {
root /usr/local/openresty/nginx/html/mobile/;
break;
}
root /usr/local/openresty/nginx/html/pc/;
}
限制图片只能通过APP(Android/IOS)和网页中访问,不允许直接访问
关键点:
(1)在Nginx中通过user_agent区分请求来源是Android还是IOS。
(2)通过referer来源,判断图片是网页中访问还是直接访问图片,因为如果在网页中加载图片带有referer请求参数表明网页域名(或者IP地址),直接在浏览器中打开图片是没有携带referer请求参数的。
配置文件内容:
server {
listen 8000;
location / {
root /opt/root;
index ;
}
location /img {
###通过判断Android还是iOS
if ($http_user_agent ~* iPhone|Android){
root /opt;
break;
#return 500;
}
#root /opt;
##判断图片请求来源
valid_referers none blocked YOUR_HOST;
if ($invalid_referer ~* 0){#注意if和(之间的空格,不然会报错
return 404;
#root /opt;
}
if ($invalid_referer ~* 1){#注意if和(之间的空格,不然会报错
root /opt;
}
}
}
参考:
/educast/article/details/108702328