nginx过滤爬虫访问

思路来自ai:

Nginx可以通过多种方式来限制爬虫的行为:

  1. **User-Agent限制**:

可以通过检查HTTP请求的User-Agent头部来识别并限制某些爬虫。例如,可以在Nginx配置文件中使用`if`语句来检查User-Agent,并使用`return`指令拒绝特定的User-Agent。

```nginx

if ($http_user_agent ~* (BadCrawler|AnotherBadCrawler)) {

return 403;

}

```

  1. **访问频率限制**:

使用Nginx的`limit_req`模块可以限制来自单个IP地址的请求频率,这可以有效地防止爬虫快速抓取网站内容。

```nginx

limit_req_zone $binary_remote_addr zone=mylimit:10m rate=1r/s;

server {

location / {

limit_req zone=mylimit burst=5;

}

}

```

  1. **IP地址封禁**:

如果发现某个IP地址是爬虫,可以使用`deny`指令直接封禁该IP。

```nginx

location / {

deny 192.168.1.1;

allow all;

}

```

  1. **URL重写**:

可以通过重写规则将爬虫导向一个特定的页面或者返回错误代码。

```nginx

if ($http_user_agent ~* BadCrawler) {

rewrite ^ /crawler-detected.html last;

}

```

  1. **使用Nginx第三方模块**:

例如,`ngx_http_robot_middleware`模块可以帮助识别并阻止已知的爬虫。

  1. **HTTP基本认证**:

对于某些特定的区域,可以设置HTTP基本认证,只有输入正确的用户名和密码才能访问。

```nginx

location /restricted/ {

auth_basic "Restricted Area";

auth_basic_user_file /etc/nginx/.htpasswd;

}

```

  1. **设置Cookie验证**:

只有带有特定Cookie的请求才被允许访问,这可以防止简单的爬虫。

需要注意的是,这些方法并不是百分之百有效的,因为一些高级的爬虫可以通过更改User-Agent、使用代理等方式来绕过这些限制。因此,除了配置Nginx之外,可能还需要结合其他策略和技术手段来更有效地限制爬虫。同时,也要确保不要误伤合法的用户和搜索引擎爬虫,这可能会对网站的SEO产生不利影响。

实际使用User-Agent限制的方式进行过滤

nginx配置为:

bash 复制代码
        # 通过客户端软件的类型、版本、所用操作系统等过滤爬虫
        location /captcha/code {
            if ($http_user_agent ~* "Mozilla\/5\.0 \(Windows NT 10\.0; Win64; x64\) AppleWebKit\/537\.36 \(KHTML, like Gecko\) Chrome\/114\.0\.0\.0 Safari\/537\.36 Edg\/114\.0\.1823\.51") {
                return 403;
            }
            proxy_pass http://mylocal/captcha/code;
        }
        
        location /ww/b/a/wwba_sendMobileCode.html {
            if ($http_user_agent ~* "Mozilla\/5\.0 \(Windows NT 10\.0; Win64; x64\) AppleWebKit\/537\.36 \(KHTML, like Gecko\) Chrome\/114\.0\.0\.0 Safari\/537\.36 Edg\/114\.0\.1823\.51") {
                return 403;
            }
            proxy_pass http://mylocal/ww/b/a/wwba_sendMobileCode.html;
        }

用到的技术有:

1、nginx的if判断(语法与常见的if基本相同):

Nginx配置中的if判断_nginx if判断-CSDN博客

nginx配置之if,break,return,rewrite - junffzhou - 博客园 (cnblogs.com)

2、nginx正则表达式及转义字符:

在正则表达式中,除了括号之外,以下字符也需要转义,因为它们在正则表达式中具有特殊的意义:

bash 复制代码
- `.`:匹配除换行符以外的任意单个字符。要匹配字面上的点,需要使用 `\.`。
- `*`:匹配前面的子表达式零次或多次。要匹配字面上的星号,需要使用 `\*`。
- `+`:匹配前面的子表达式一次或多次。要匹配字面上的加号,需要使用 `\+`。
- `?`:标记前面的子表达式为非贪婪的,或者匹配前面的子表达式零次或一次。要匹配字面上的问号,需要使用 `\?`。
- `^`:匹配输入字符串的开始位置。要匹配字面上的脱字符,需要使用 `\^`。
- `$`:匹配输入字符串的结束位置。要匹配字面上的美元符号,需要使用 `\$`。
- `|`:指明两项之间的一个选择。要匹配字面上的竖线,需要使用 `\|`。
- `[` 和 `]`:用于定义字符集。要匹配字面上的左方括号或右方括号,需要分别使用 `\[` 和 `\]`。
- `{` 和 `}`:用于指定重复次数的范围。要匹配字面上的大括号,需要分别使用 `\{` 和 `\}`。
以下是一个转义所有特殊字符的示例:
```regex
\a\.b\*c\+d\e?f\^g\$h\|i\[j\]k\{l\}m\n
```
在这个正则表达式中:
- `\a` 匹配字面上的字母 "a"。
- `\.` 匹配字面上的点。
- `\*` 匹配字面上的星号。
- `\+` 匹配字面上的加号。
- `\?` 匹配字面上的问号。
- `\^` 匹配字面上的脱字符。
- `\$` 匹配字面上的美元符号。
- `\|` 匹配字面上的竖线。
- `\[` 和 `\]` 分别匹配字面上的左方括号和右方括号。
- `\{` 和 `\}` 分别匹配字面上的左大括号和右大括号。
- `\n` 匹配换行符(在这里是一个转义字符,但不是正则表达式的特殊字符)。
  • `.`:匹配除换行符以外的任意单个字符。要匹配字面上的点,需要使用 `\.`。

  • `*`:匹配前面的子表达式零次或多次。要匹配字面上的星号,需要使用 `\*`。

  • `+`:匹配前面的子表达式一次或多次。要匹配字面上的加号,需要使用 `\+`。

  • `?`:标记前面的子表达式为非贪婪的,或者匹配前面的子表达式零次或一次。要匹配字面上的问号,需要使用 `\?`。

  • `^`:匹配输入字符串的开始位置。要匹配字面上的脱字符,需要使用 `\^`。

  • `\`:匹配输入字符串的结束位置。要匹配字面上的美元符号,需要使用 \`\\`。

  • `|`:指明两项之间的一个选择。要匹配字面上的竖线,需要使用 `\|`。

  • `[` 和 `]`:用于定义字符集。要匹配字面上的左方括号或右方括号,需要分别使用 ' \ [ ' 和 ' \ ] '。

  • `{` 和 `}`:用于指定重复次数的范围。要匹配字面上的大括号,需要分别使用 `\{` 和 `\}`。

以下是一个转义所有特殊字符的示例:

```regex

\a\.b\*c\+d\e?f\^g\$h\|i\ [ j \]k\{l\}m\n

```

在这个正则表达式中:

  • `\a` 匹配字面上的字母 "a"。

  • `\.` 匹配字面上的点。

  • `\*` 匹配字面上的星号。

  • `\+` 匹配字面上的加号。

  • `\?` 匹配字面上的问号。

  • `\^` 匹配字面上的脱字符。

  • `\$` 匹配字面上的美元符号。

  • `\|` 匹配字面上的竖线。

  • ' \ [ ' 和 ' \ ] ' 分别匹配字面上的左方括号和右方括号。

  • `\{` 和 `\}` 分别匹配字面上的左大括号和右大括号。

  • `\n` 匹配换行符(在这里是一个转义字符,但不是正则表达式的特殊字符)。

在 Nginx 配置文件中,当使用正则表达式时,通常不需要转义空格、字母和数字等非特殊字符。

3、使用proxy_pass设置跳转地址

不要使用rewrite:

rewrite ^/(.*)$ https://www.baidu.com/captcha/code permanent;

客户端会重复请求该地址

4、使用valid_referers设置防无referer的爬虫

bash 复制代码
        # 通过客户端软件的类型、版本、所用操作系统等过滤爬虫
        location /captcha/code {
            access_log logs/webaccess_sms.log main;
            valid_referers *.baidu.com; # 改成自己的服务器IP或域名
            if ($invalid_referer) {
                return 403;
            }
            if ($http_user_agent ~* "Mozilla\/5\.0 \(Windows NT 10\.0; Win64; x64\) AppleWebKit\/537\.36 \(KHTML, like Gecko\) Chrome\/114\.0\.0\.0 Safari\/537\.36 Edg\/114\.0\.1823\.51") {
                return 403;
            }
            proxy_pass http://mylocal/captcha/code;
        }
        
        location /ww/b/a/wwba_sendMobileCode.html {
            access_log logs/webaccess_sms.log main;
            valid_referers *.baidu.com;
            if ($invalid_referer) {
                return 403;
            }
            if ($http_user_agent ~* "Mozilla\/5\.0 \(Windows NT 10\.0; Win64; x64\) AppleWebKit\/537\.36 \(KHTML, like Gecko\) Chrome\/114\.0\.0\.0 Safari\/537\.36 Edg\/114\.0\.1823\.51") {
                return 403;
            }
            proxy_pass http://mylocal/ww/b/a/wwba_sendMobileCode.html;
        }

Nginx配置referers防盗链(示意图+代码举例)_nginx防盗链 referer-CSDN博客

Nginx配置referer校验,实现简单的防盗链 - 爱折腾的大臭臭 - 博客园 (cnblogs.com)

nginx配置跨域(CORS)、防盗链(valid_referers)、缓存(expires)、压缩(gzip) - sucre_tan - 博客园 (cnblogs.com)

https://www.cnblogs.com/moutory/p/17752682.html

nginx官网:

Module ngx_http_referer_module

相关推荐
追梦不止~1 分钟前
Docker常用命令+详解
运维·docker·容器
黑龙江亿林等保4 分钟前
深入探索哈尔滨二级等保下的负载均衡SLB及其核心算法
运维·算法·负载均衡
黄小耶@5 分钟前
linux常见命令
linux·运维·服务器
叫我龙翔6 分钟前
【计网】实现reactor反应堆模型 --- 框架搭建
linux·运维·网络
古驿幽情9 分钟前
CentOS AppStream 8 手动更新 yum源
linux·运维·centos·yum
BillKu9 分钟前
Linux(CentOS)安装 Nginx
linux·运维·nginx·centos
BillKu13 分钟前
Linux(CentOS)yum update -y 事故
linux·运维·centos
a2663789618 分钟前
解决yum命令报错“Could not resolve host: mirrorlist.centos.org
linux·运维·centos
上海文顺负载箱31 分钟前
如何评估焊机测试负载均衡性能
运维·负载均衡
铁锤妹妹头发多1 小时前
新手用docker真**难受
运维·docker·容器