这是我参与更文挑战的第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模块
下载该模块编译后,nginx具备了ip识别功能,那我们得有对应的ip数据库,因此还需下载IP相关数据
2:IP数据库,最新下载地址:www.miyuru.lk/geoiplegacy,
我也在2023-06-04上传了一份到:github.com/leach-chen/…
我下载的是DB-IP - Country,如果要精确到城市可以下City的
二、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;
}
}
}
}