思路来自ai:
Nginx可以通过多种方式来限制爬虫的行为:
- **User-Agent限制**:
可以通过检查HTTP请求的User-Agent头部来识别并限制某些爬虫。例如,可以在Nginx配置文件中使用`if`语句来检查User-Agent,并使用`return`指令拒绝特定的User-Agent。
```nginx
if ($http_user_agent ~* (BadCrawler|AnotherBadCrawler)) {
return 403;
}
```
- **访问频率限制**:
使用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;
}
}
```
- **IP地址封禁**:
如果发现某个IP地址是爬虫,可以使用`deny`指令直接封禁该IP。
```nginx
location / {
deny 192.168.1.1;
allow all;
}
```
- **URL重写**:
可以通过重写规则将爬虫导向一个特定的页面或者返回错误代码。
```nginx
if ($http_user_agent ~* BadCrawler) {
rewrite ^ /crawler-detected.html last;
}
```
- **使用Nginx第三方模块**:
例如,`ngx_http_robot_middleware`模块可以帮助识别并阻止已知的爬虫。
- **HTTP基本认证**:
对于某些特定的区域,可以设置HTTP基本认证,只有输入正确的用户名和密码才能访问。
```nginx
location /restricted/ {
auth_basic "Restricted Area";
auth_basic_user_file /etc/nginx/.htpasswd;
}
```
- **设置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官网: