在Nginx中过滤爬虫可以通过识别User-Agent来实现。以下是几种常用的配置方法:
server {
listen 80;
server_name example.com;
# 定义要阻止的爬虫User-Agent列表
set $block_user_agents 0;
if ($http_user_agent ~* (wget|curl|scrapy|python-requests|python-urllib|java|httpclient|go-http-client|php|ruby|perl|nikto|sqlmap|nmap)) {
set $block_user_agents 1;
}
# 可以继续添加更多爬虫标识
if ($http_user_agent ~* (bot|spider|crawler|slurp|mediapartners-google)) {
set $block_user_agents 1;
}
if ($block_user_agents = 1) {
return 403;
# 或者可以重定向到其他页面
# return 301 http://example.com/blocked.html;
}
# 其他正常配置...
}
map $http_user_agent $bad_bot {
default 0;
~*(wget|curl|scrapy|python-requests|python-urllib|java|httpclient|go-http-client|php|ruby|perl|nikto|sqlmap|nmap) 1;
~*(bot|spider|crawler|slurp|mediapartners-google) 1;
}
server {
listen 80;
server_name example.com;
if ($bad_bot) {
return 403;
}
# 其他正常配置...
}
/etc/nginx/bots.d/blockbots.conf
文件:# 恶意爬虫和扫描器
if ($http_user_agent ~* (wget|curl|libwww-perl|python|nikto|sqlmap|nmap|nessus|openvas|metasploit|hydra)) {
return 403;
}
# 搜索引擎爬虫(可根据需要放行)
if ($http_user_agent ~* (bot|spider|crawler|slurp|mediapartners-google|bingbot|baiduspider|yandexbot)) {
return 403;
}
# 空User-Agent
if ($http_user_agent ~ ^$) {
return 403;
}
http {
include /etc/nginx/bots.d/blockbots.conf;
# 其他配置...
}
http {
limit_req_zone $binary_remote_addr zone=bot_zone:10m rate=10r/s;
server {
location / {
limit_req zone=bot_zone burst=20 nodelay;
# 其他配置...
}
}
}
配置完成后记得测试并重载Nginx:
nginx -t && nginx -s reload
过度严格的User-Agent过滤可能会影响合法的爬虫(如搜索引擎爬虫),请根据实际需求调整。
更复杂的爬虫防护可以考虑使用Nginx+Lua或专门的WAF解决方案。
定期更新爬虫User-Agent列表,因为新的爬虫工具会不断出现。
可以结合日志分析来识别和添加新的恶意爬虫User-Agent。