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

相关推荐
云计算-Security12 分钟前
Jenkins 执行器(Executor)如何调整限制?
运维·jenkins
***似水流年***22 分钟前
Linux任务管理与守护进程
linux·运维·服务器
天天爱吃肉82181 小时前
车载以太网驱动智能化:域控架构设计与开发实践
java·运维·网络协议·微服务
愚润求学2 小时前
【Linux】进程间通信(一):认识管道
linux·运维·服务器·开发语言·c++·笔记
SHUIPING_YANG3 小时前
Nginx 返回 504 状态码表示 网关超时(Gateway Timeout)原因排查
运维·nginx·gateway
光不度AoKaNa3 小时前
计算机操作系统概要
linux·运维·服务器
晚秋大魔王3 小时前
OpenHarmony 开源鸿蒙南向开发——linux下使用make交叉编译第三方库——wget
java·linux·运维·开发语言·华为·harmonyos
孤的心了不冷3 小时前
【Linux】Linux安装并配置MongoDB
linux·运维·mongodb·容器
南棱笑笑生3 小时前
20250517让NanoPi NEO core开发板在Ubuntu core16.04.2下支持TF卡的热插拔
linux·运维·ubuntu
jinlei20094 小时前
配置ssh服务-ubuntu到Windows拷贝文件方法
运维·ubuntu·ssh