nginx 可通过 geoip2 模块结合 map 指令实现按国家跳转:先配置 geoip2 加载 geolite2 数据库并提取 iso 国家代码,再用 map 映射国家码到目标 url,最后在 server 块中用 if 判断 $redirect_url 并 return 302 跳转。

在 Nginx 中,server 块本身不直接支持按国家跳转,但可通过结合 IP 地理位置数据库(如 GeoIP2)和 map 指令实现基于访问者国家的条件跳转。核心是识别 IP 所属国家,再用 return 或 rewrite 触发重定向。
启用 GeoIP2 模块并加载国家数据
Nginx 官方模块 ngx_http_geoip2_module 替代了已废弃的旧版 GeoIP。需先编译安装该模块,并下载 MaxMind 的 GeoLite2 Country 数据库(GeoLite2-Country.mmdb)。
在 http 块中配置:
geoip2 /path/to/GeoLite2-Country.mmdb {
$geoip2_data_country_code country iso_code;
}
该配置将客户端 IP 对应的 ISO 国家代码(如 CN、US、JP)存入变量 $geoip2_data_country_code。
用 map 构建国家到目标 URL 的映射
避免在 server 块内大量 if 判断,推荐用 map 预定义跳转规则:
map $geoip2_data_country_code $redirect_url {
default "";
CN "https://cn.example.com$request_uri";
JP "https://jp.example.com$request_uri";
US "https://us.example.com$request_uri";
}
-
default ""表示未匹配国家时不做跳转 - 保留
$request_uri可维持原始路径和查询参数 - 若需 HTTP 跳转而非 HTTPS,对应写成
http://...
在 server 块中执行跳转逻辑
在具体 server 块中判断变量是否非空,触发 302 重定向:
server {
listen 80;
server_name example.com;
<pre class="brush:php;toolbar:false;">if ($redirect_url) {
return 302 $redirect_url;
}
# 其他常规配置,如 root、index 等}
注意:if 在 location 外使用是安全的(仅用于 return/rewrite),此处用于快速终止并跳转。不建议在 location 内混用 if + rewrite,易出错。
测试与常见问题
部署后可用不同地区代理或 curl 指定 IP 测试:
curl -x "proxy-from-jp:8080" http://example.com/
- 确保 Nginx 用户对
.mmdb文件有读取权限 - 若变量始终为空,检查 IP 是否在数据库中(如私有地址 192.168.x.x 不包含地理信息)
- 更新数据库:MaxMind 每月发布新版,需定期替换
.mmdb并 reload Nginx











