【Day9】Nginx实战训练营
32/33/34/35/36 nginx访问控制
5、Nginx 基于 $user_agent 的访问控制
user_agent 大家并不陌生,可以简单理解成浏览器标识,包括一些蜘蛛爬虫都可以通过user_agent来辨识。
通过观察访问日志,可以发现一些搜索引擎的蜘蛛对网站访问特别频繁,它们并不友好。
为了减少服务器的压力,其实可以把除主流搜索引擎蜘蛛外的其他蜘蛛爬虫全部封掉。
另外,一些cc攻击,我们也可以通过观察它们的user_agent找到规律。
- 示例:
if ($http_user_agent ~ 'YisouSpider|MJ12bot/v1.4.2|YoudaoBot|Tomato')
{
return 403;
}
-
说明: user_agent包含以上关键词的请求,全部返回403状态码。
-
访问测试:
1、curl -A “123YisouSpider1.0”
2、curl -A “MJ12bot/v1.4.1”
[root@alexis-01 ~]# curl -x127.0.0.1:80 www.1.com/index.php -A'Tomato' -I
HTTP/1.1 403 Forbidden
Server: nginx/1.16.1
Date: Thu, 31 Dec 2019 13:55:15 GMT
Content-Type: text/html
Content-Length: 153
Connection: keep-alive
[root@alexis-01 ~]# curl -x127.0.0.1:80 www.1.com/index.php -A'Tomasto' -I
HTTP/1.1 404 Not Found
Server: nginx/1.16.1
Date: Sun, 03 Nov 2019 13:55:25 GMT
Content-Type: text/html
Content-Length: 153
Connection: keep-alive
6、Nginx 基于 $http_referer 的访问控制
在前面讲解 rewrite 时,曾经用过该变量,当时实现了防盗链功能。
其实基于该变量,我们也可以做一些特殊的需求。
- 示例:
- 背景: 网站被黑挂马,搜索引擎收录的网页是有问题的,当通过搜索引擎点击到网站时,却显示一个博彩网站。
由于查找木马需要时间,不能马上解决,为了不影响用户体验,可以针对此类请求做一个特殊操作。
比如,可以把从百度访问的链接直接返回 404 状态码,或者返回一段 html 代码。
if ($http_referer ~ 'baidu.com')
{
return 407;
}
或者
if ($http_referer ~ 'baidu.com')
{
return 200 "<html><script>window.location.href='//$host$request_uri';</script></html>";