通过nginx GeoIP模块 限制不同地区访问网站

通过nginx GeoIP模块来限制某些国家或者具体地区访问网站,在国内一般用于外贸站,因为很多外贸公司走货的价格关系,是不希望国内用户看见的。
除了某些CDN或者付费接口之外,也可以通过本身的服务器来操作,或者浏览器判断等。
我之前就是用浏览器来判断的,如果浏览器的语言是中文ZH,那么网站就跳转到不能访问的地址,这算是一个很粗暴的方法,但是有时候可能又需要用户稍微变通一下,让国内用户可以看见。
那么这个判断方法就不是很适合了,万一遇到某些人不懂浏览器的,不会设置语言呢…就麻烦了。
所以可以采用ip判断的方法,现在用得比较多的应该是MaxMind的免费ip库,国内大企业付费应该用ipip.net的比较多。
我就只是判断下国家,所以就用MaxMind的来做判断。
另外这个方法,不适合用于套CDN的网站,因为CDN是通过cdn的ip在访问,这个获取的是cdn的ip。
如果是用于监听CDN网站,就需要把cdnip被过滤了。
实在是嫌弃麻烦,就直接用一些dns来判断。

服务器后端属于nginx,比较方便。

一、编译–with-http_geoip_module模块

先看nginx有没有编译geoip模块,如果有就直接修改就行,没有就得先安装。

nginx -V #查看目前的nginx相关配置
1:下载安装Geoip模块

 
  1. yum -y install geoip-devel #CentOS系统

  2.  
  3. 这会自动安装到/usr/share/GeoIP文件夹下,这个安装的并不一定是最新的,我们就更新下

  4.  
  5. mv /usr/share/GeoIP/GeoIP.dat /usr/share/GeoIP/GeoIP.dat_bak #备份下

  6.  
  7. cd /usr/share/GeoIP #进文件夹

  8.  
  9. wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz #下载最新数据库

  10.  
  11. gunzip GeoIP.dat.gz #解压出来

2:编译geoip模块

 
  1. cd /root/oneinstack/src/nginx-1.12.1 #进入当前nginx文件夹 根据自己目录来

  2.  
  3. ./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_stub_status_module --with-http_v2_module --with-http_ssl_module --with-http_gzip_static_module --with-http_realip_module --with-http_flv_module --with-http_mp4_module --with-openssl=../openssl-1.0.2l --with-pcre=../pcre-8.41 --with-pcre-jit --with-ld-opt=-ljemalloc --add-module=../lua-nginx-module --add-module=../ngx_devel_kit --with-http_geoip_module #添加编译模块

  4.  
  5. 就是把--with-http_geoip_module加到原来的编译上去

  6.  
  7. make && make install #执行编译

走完之后,用nginx -V看看里面有没有geoip的模块,如果有就是成功了。

二、修改nginx的配置文件

1:修改nginx.conf的http区域,在里面加上这段

 
  1. geoip_country /usr/share/GeoIP/GeoIP.dat; #GeoIP所在目录

  2. map $geoip_country_code $allowed_country { #变量判断

  3. default yes; #允许

  4. CN no; #区域不允许,这个CN就是代表中国,如果是多个地区,就是CN下面加就行

  5. }

还有几种写法:

 
  1. geoip_country GeoIP/GeoIP.dat;

  2.  
  3. geoip_city GeoIP/GeoLiteCity.dat;

2:修改nginx.conf的server区域

 
  1. location / {

  2. root /data/wwwroot/test; #网站目录

  3. if ($allowed_country = no) { #这里的no,就是上面html里面CN on,就是判断no区域

  4.  
  5. #if ($allowed_country = no) 也可以用if ($geoip_country_code = CN) 来代替,如果是多个区域就在CN后面几个|然后加区域代码

  6. return 403; #返回403提示

  7. return http://域名; #跳转到其他人网站去 ,return也可以用rewrite,具体看自己网站的配置文件怎么设置的

  8. root /data/wwwroot/test1; #跳转到自己服务器的另外一个文件夹下面去

  9. }

  10. }

最后nginx -t看看有没有什么语法错误,没有就重启下nginx打开网站看看,有就自己找原因吧。

nginx Geoip的写法有很多种,多谷歌看看。

附:

最后也说下浏览器语言判断的,就是下面这段就行了,用javascript加在自己网站的首页。

 
  1. if (navigator.language)

  2. var language = navigator.language;

  3. else

  4. var language = navigator.browserLanguage;

  5.  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值