nginx 配置GeoIP实现相同域名不同国家访问不同网站

518 阅读2分钟

这是我参与更文挑战的第5天,活动详情查看: 更文挑战

我们在开发网站的时候,相同域名的URL,在不同国家访问,可能需要展示不同的网站需求。

比如在国内访问,www.xxx.com 时,链接会自动重定向到www.xxx.com?lang=cn

在香港访问,www.xxx.com 时,链接会自动重定向到www.xxx.com?lang=hk,

那如果能实现这种效果呢?如果网站是通过nginx配置访问的,那么可以通过GeoIP配置来帮助我们实现这个功能,主要过程就是请求到达nginx时,通过GeoIP库判断属于哪个国家的ip,然后再进行链接重定向操作

一、GeoIp相关下载

这里要下载两个东西

1:GeoIP模块

下载地址:github.com/leach-chen/…

下载该模块编译后,nginx具备了ip识别功能,那我们得有对应的ip数据库,因此还需下载IP相关数据

2:IP数据库,最新下载地址:www.miyuru.lk/geoiplegacy

我也在2023-06-04上传了一份到:github.com/leach-chen/…

我下载的是DB-IP - Country,如果要精确到城市可以下City的

image.png

二、GeoIP模块编译

将GeoIP-1.4.8.tar.gz下载并放到服务器目录下(目录自己决定),然后进行解压、编译、安装

# tar -zxvf GeoIP.tar.gz

# cd GeoIP-1.4.8

# ./configure

# make; make install

# echo '/usr/local/lib' > /etc/ld.so.conf.d/geoip.conf

# ldconfig

三、IP数据

下载第一步中第二点提到的ip数据库 dbip.dat.gz,并上传到服务器目录下(目录自己决定),并进行解压,解压路径需要记住,后面需要配置到nginx里面,这里我放到/root/GeoIP/

# cd /root/GeoIP/
# gunzip dbip.dat.gz
# ls
# dbip.dat

四、nginx配置

这里我只摘取了需要配置的代码,其它nginx配置不相关代码没有贴出来。 下面配置是我调试过程中进行配置的,可能有更好的编写方式,大家可以自行摸索,调试过程配置完成执行nginx -s reload,在浏览器里访问一般都是即时生效

下面代码中

1:geoip_country /root/GeoIP/dbip.dat 配置IP数据路径

2:if ($geoip_country_code = CN) 即是GeoIp模块识别到的ip所对应的国家,然后我们就可以进行ip重定向操作

    http {
    	geoip_country /root/GeoIP/dbip.dat; #配置IP数据路径
    	fastcgi_param GEOIP_COUNTRY_CODE $geoip_country_code;
    	fastcgi_param GEOIP_COUNTRY_CODE3 $geoip_country_code3;
    	fastcgi_param GEOIP_COUNTRY_NAME $geoip_country_name;
        
    	server {
    		
    		location / {

    			#获取url完整请求
    			set $URL  $scheme://$http_host$request_uri;

    			set $flag "1";


    			if ($URL ~* "lang=") {
    			  set $flag "${flag}2";
    			}

    			
    			if ($geoip_country_code = CN) {
    			  set $flag "${flag}-1";
    			}

    			if ($geoip_country_code = HK) {
                           set $flag "${flag}-2";
                        }
    	
    			if ($geoip_country_code = JP) {
                           set $flag "${flag}-3";
                        }


    			if ($flag = "1-1")
    			{

    			    #rewrite ^/(.*) http://www.xxx.com?lang=cn permanent;
    			    rewrite ^/(.*) "${URL}?lang=cn" permanent; #用该方式,上面方式会导致静态资源也被重定向导致无法正常加载
    			}

    			if ($flag = "1-2")
                        {

                           rewrite ^/(.*) "${URL}?lang=cn" permanent;
                        }


    			if ($flag = "1-3")
                        {

                          rewrite ^/(.*) "${URL}?lang=cn" permanent;
                        }

    		}

    	}
    }