Nginx通过rewrite实现多语言目录自动重定向:访问/时,优先基于GeoIP2模块按IP国家码302跳转至/ja/、/zh/等对应语言子目录;若不可用,则降级解析Accept-Language头提取首语言标签跳转;规则严格限定location = /,避免误匹配子路径,并需配合多语言静态资源路由或后端剥离前缀代理。

用 Nginx 的 rewrite 实现多语言目录自动重写,核心是:**在用户访问根路径(/)且未带语言前缀时,根据客户端 IP 或浏览器语言(Accept-Language)自动跳转到对应语言子目录**,比如 /ja/、/zh/、/en/。这不是单纯改 URL 路径,而是做 302 临时重定向,让浏览器地址栏立即变化。
基于 IP 地理位置自动跳转
这是最常见也较可靠的方式,需配合 GeoIP 模块(如 ngx_http_geoip2_module)或使用 IP 库(如 MaxMind GeoLite2)。Nginx 本身不内置 IP 归属地识别,必须先加载地理信息数据。
- 安装并配置
geoip2模块,加载GeoLite2-Country.mmdb - 在
http块中定义映射变量,例如:geoip2 /path/to/GeoLite2-Country.mmdb { $geoip2_data_country_code source=$remote_addr country iso_code; } - 在
server块中添加判断和 rewrite:
location = / {<br> if ($geoip2_data_country_code = "JP") { return 302 /ja/; }<br> if ($geoip2_data_country_code = "CN") { return 302 /zh/; }<br> return 302 /en/;<br>}
注意:if 在 location 内使用是安全的;避免在 server 级直接用 if 套 rewrite,易出意外交互。
基于 Accept-Language 请求头跳转
当无法部署 GeoIP,或想兼顾海外华人等场景时,可读取浏览器发送的 Accept-Language 头。它通常包含优先级顺序,如 zh-CN,zh;q=0.9,en;q=0.8。
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
- 用正则提取首项语言标签:
set $lang ""; if ($http_accept_language ~* "^(zh-CN|zh-TW|zh-HK)") { set $lang "zh"; } if ($http_accept_language ~* "^ja") { set $lang "ja"; } if ($http_accept_language ~* "^en") { set $lang "en"; } - 再统一跳转:
location = / { if ($lang != "") { return 302 /$lang/; } return 302 /en/; }
该方式轻量,但依赖客户端设置,可能不准(比如日本用户切换了英文系统),建议作为 GeoIP 的补充或降级方案。
rewrite 规则要避开已带语言前缀的请求
自动跳转只应作用于裸根路径 /,不能影响 /ja/about 或 /zh/api 这类已有前缀的请求。因此规则必须精准匹配:
- 用
location = /严格匹配根 URI,不匹配/anything - 不要写成
location / { rewrite ^/$ /zh/ redirect; }—— 这会误伤所有子路径 - 若还需处理
/index.html等默认首页入口,可额外加一条:location = /index.html { return 302 /zh/; }
后续请求的静态资源与反向代理适配
跳转后用户进入 /zh/,后续所有请求(如 /zh/css/app.css)需能正常服务。这就要求:
- 静态文件目录结构支持多语言子目录,例如
/usr/share/nginx/html/zh/、/ja/ - 或统一用 root + alias 配合
try_files,例如:location ~ ^/(?[a-z]{2})/(? .*)$ { alias /usr/share/nginx/html/$lang/$rest; try_files $uri $uri/ =404; } - 若后端是应用服务器(如 Node/Python),建议把语言前缀剥离后再转发,用
proxy_pass http://backend/$rest;(需启用regexlocation)










