可通过Nginx的map指令将地区标识映射为公告页路径,再结合root+try_files或alias实现按地区分发静态页;需依赖GeoIP模块或替代方案获取地区信息,并注意变量路径安全与权限配置。

可以通过 Nginx 的 map 指令将客户端请求的地区(通常基于 IP 归属地或请求头)映射为一个变量,再结合 try_files 或 alias 实现按地区分发不同静态公告页。核心是“动态选路径,静态发内容”。
用 map 根据 IP 地区映射公告页路径
Nginx 本身不内置 IP 地理位置库,需先通过第三方模块(如 ngx_http_geoip2_module)或预处理(如用 Lua、外部服务)获得地区标识(例如 $geo_country_code)。然后用 map 将其转为对应公告页的文件路径:
map $geo_country_code $notice_page {
default "/notices/global.html";
CN "/notices/cn.html";
US "/notices/us.html";
JP "/notices/jp.html";
KR "/notices/kr.html";
}该变量 $notice_page 可在 server 或 location 块中直接引用。
在 location 中匹配并返回对应静态页
假设所有公告页都放在 /var/www/html/notices/ 下,可通过 alias + 变量实现精准映射:
location = /announcement {
alias /var/www/html$notice_page;
# 确保不拼接多余路径,alias 末尾无斜杠时,= 匹配需严格
# 若用 try_files,可搭配 root 使用:
# root /var/www/html;
# try_files $notice_page =404;
}注意:alias 不支持变量拼接完整路径(如 alias /var/www/html$notice_page; 是合法的),但要求 $notice_page 必须以 / 开头且不含 .. 跳转;更安全的做法是统一用 root + try_files:
root /var/www/html;-
try_files $notice_page =404;(此时$notice_page应为/notices/cn.html这类相对 URI 路径)
补充:无 GeoIP 模块时的轻量替代方案
若无法编译安装 geoip2 模块,可用以下方式降级实现:
- 用
geo指令配合 IP 段粗略划分(适合固定出口 IP 的企业内网) - 读取客户端请求头(如
$http_x_forwarded_for+ 自定义 headerX-Region),由上游网关或前端注入地区标识 - 用 OpenResty + Lua 查询离线 GeoIP 数据库(如 GeoLite2 City),动态赋值给变量再交由 map 处理
验证与调试要点
发布前务必测试变量是否生效:
- 临时加
add_header X-Notice-Page "$notice_page";查看响应头 - 确认文件权限:Nginx worker 进程需有读取
/var/www/html/notices/*.html的权限 - 静态页建议使用绝对路径引用资源(CSS/JS),或统一配置
root避免 404

















