NGINX按国家屏蔽流量仅放行指定国家及搜索爬虫配置失效求助
问题诊断
- 核心逻辑错误:Nginx的
set指令是覆盖赋值而非拼接赋值,你原配置中如果两个判断条件同时触发,第二个set $blocked G会直接覆盖第一个set $blocked I的结果,最终$blocked永远不可能等于IG,拦截逻辑永远不会触发。 - 潜在配置问题:需要确认Nginx已加载
ngx_http_geoip_module模块,且/usr/share/GeoIP/GeoIP.dat文件存在、Nginx进程有读取权限;部分新版本系统默认使用GeoIP2数据库,若你使用的是GeoIP2模块,原GeoIP1的配置语法不兼容。
修正配置
首先调整变量赋值逻辑为追加模式,修正后的完整配置如下:
# 部分系统需要在nginx.conf顶层添加该行加载模块,确认已加载可忽略 # load_module modules/ngx_http_geoip_module.so; geoip_country /usr/share/GeoIP/GeoIP.dat; map $geoip_country_code $allowed_country { default no; RU yes; } server { listen 443 ssl http2; server_name _default; # 初始化blocked变量为空字符串 set $blocked ""; if ($allowed_country = no) { # 追加字符I set $blocked "${blocked}I"; } if ($http_user_agent !~* (google|bing|yandex|msnbot|applebot)) { # 追加字符G set $blocked "${blocked}G"; } # 只有两个条件都满足时blocked值为IG,才触发拦截 if ($blocked = IG){ return 444; } # 其余原有配置保持不变 ... }
验证方法
配置修改后执行nginx -t检查语法无误后重载配置,可通过境外代理直接访问、修改UA为爬虫后境外访问两种场景,验证规则是否符合预期。
内容的提问来源于stack exchange,提问作者jazzfriends
相关产品推荐
相关产品推荐

