推荐用 map 指令预映射域名到语言根目录,如 map $host $lang_root { zh.example.com /var/www/zh; ... },再在 server 块中 root $lang_root;;或为每个子域设独立 server 块并指定 root;目录结构须严格一致,确保 /about/team.html 等路径在各语言目录下均存在。

用 map 预映射域名到语言根目录
这是最推荐的方式:把语言识别逻辑提前到请求解析初期,性能好、配置干净。
- 在
http块中定义映射关系,例如:map $host $lang_root {<br> default /var/www/default;<br> zh.example.com /var/www/zh;<br> en.example.com /var/www/en;<br> ja.example.com /var/www/ja;<br>} - 每个域名对应一个真实存在的物理路径,路径必须有读取权限(如
www-data可读) - 在
server块中直接使用:root $lang_root;,Nginx 会在匹配 host 后立即确定根路径
用独立 server 块按子域隔离(语义最清晰)
适合语言数量不多、或需要单独配置 HTTPS/缓存/日志的场景。
- 每个语言子域写一个
server块,靠server_name匹配:server {<br> listen 80;<br> server_name zh.example.com;<br> root /var/www/zh;<br> index index.html;<br> try_files $uri $uri/ /index.html;<br>} - 所有
server块互不影响,可分别加 SSL、限流、CSP 等策略 - 前端资源路径保持一致(如都用
/css/app.css),只需确保各目录下结构相同
目录结构要与 root + URI 拼接逻辑对齐
`root` 不是“替换”,而是“拼接”——请求的完整 URI(包括路径前缀)会原样加到 root 路径末尾。
- 比如
root /var/www/zh;+ 请求/about/team.html→ 实际查找/var/www/zh/about/team.html - 所以各语言目录下的子路径必须完全一致:
/var/www/zh/、/var/www/en/、/var/www/ja/下都要有about/team.html - 建议统一构建输出结构,例如用 CI 工具生成
zh/、en/、ja/三个平行目录
补充:首页自动跳转或 fallback 处理
仅靠 `root` + `index` 无法自动识别浏览器语言,但可以加一层简单 fallback:
- 在 `location /` 中配合 `try_files`,先找当前语言页,再退到默认语言:
try_files $uri $uri/ /index.html =404;(前提是 `index.html` 在各语言目录下存在) - 若需根据
Accept-Language头重定向,需用 `map` 提取语言偏好,再配合 `return 302`,但这属于客户端协商,不是 root 的职责











