如果要做针对地区或者ip的访问控制,有比较多的办法,比如if ($remote_addr ~ 211.156.184.) {deny all;} ,匹配这个段的ip,直接返回403,如果要针对一系列的ip,一个地区,甚至经纬度,就不好做了,当然还有更加灵活的,就是用nginx自带的模块 geoip模块。
Nginx的编译参数,关键是加了 http_geoip_module模块,需要geoip库支持yum -y install geoip-devel 或者在 http://pkgs.repoforge.org/geoip 这里下载,
nginx -V
nginx version: nginx/1.2.4
built by gcc 4.1.2 20080704 (Red Hat 4.1.2-52)
TLS SNI support disabled
configure arguments: –user=www –group=www –prefix=/usr/local/nginx –with-http_stub_status_module –with-google_perftools_module –with-http_ssl_module –with-http_realip_module –with-http_geoip_module
下载两个ip数据包直接放在nginx的conf目录并解压:
axel http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz
axel http://www.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz
在nginx.conf的http字段加载ip库:
geoip_country GeoIP.dat;
geoip_city GeoLiteCity.dat;
然后就在server里面设置即可。
比如:
location /{
if ($geoip_city = Guangzhou) {
root /data/web/guangzhou;
}
if ($geoip_region = “30” ) {
root /data/web/guangdong;
}
}
或者
if ($geoip_region = 30) {
rewrite ^/index.html http://www.renzhemao.com/home.html permanent;
}
当ip来自广东时候,把首页重定向到home.html.
或者
location /geoip/ {
rewrite .* /?country=$geoip_country_code;
}
当不确定具体是否有城市名可以用strings命令查看字符串,比如:
strings GeoLiteCity.dat |grep -i guangzhou
这样就匹配到了 Guangzhou ,所以我们可以用 Guangzhou这个城市名。
当然变量支持正则匹配,比如:
if ($geoip_region ~ “(30|31)”)
我们测试时候可能不一定准,因为我们用的数据源是免费的,具体可以在官网查询:http://www.maxmind.com/en/geoip_demo
相应的省份代码:
CN,01,”Anhui”
CN,02,”Zhejiang”
CN,03,”Jiangxi”
CN,04,”Jiangsu”
CN,05,”Jilin”
CN,06,”Qinghai”
CN,07,”Fujian”
CN,08,”Heilongjiang”
CN,09,”Henan”
CN,10,”Hebei”
CN,11,”Hunan”
CN,12,”Hubei”
CN,13,”Xinjiang”
CN,14,”Xizang”
CN,15,”Gansu”
CN,16,”Guangxi”
CN,18,”Guizhou”
CN,19,”Liaoning”
CN,20,”Nei Mongol”
CN,21,”Ningxia”
CN,22,”Beijing”
CN,23,”Shanghai”
CN,24,”Shanxi”
CN,25,”Shandong”
CN,26,”Shaanxi”
CN,28,”Tianjin”
CN,29,”Yunnan”
CN,30,”Guangdong”
CN,31,”Hainan”
CN,32,”Sichuan”
CN,33,”Chongqing”
具体查询http://dev.maxmind.com/static/maxmind-region-codes.csv,也可以通过下载csv版本的ip库手动查询,比如搜索Guanzhou,会出现,”CN”,”30″,”Guangzhou”,这个30就是省份了。
变量支持多种类型,比如经纬度邮政编码之类的,不过都是模糊匹配,精度不高,不过也够用了。 更多变量请参考nginx模块参考手册: