完全可行,通过nginx基于域名的虚拟主机配置,为每个子域(如zh.example.com)设置独立server块并指定对应root目录;或用map指令统一映射域名到路径,再在单个server中复用,配合https与hreflang标签实现seo友好的多语言托管。

想用一个 Nginx 服务器托管多个语言版本的网站(比如 zh.example.com、en.example.com、ja.example.com),并让它们分别指向各自独立的文件目录(如 /var/www/zh/、/var/www/en/),不需要改代码、不依赖后端路由——这是完全可行的,核心就是利用 Nginx 的 基于域名的虚拟主机 + root 指令动态切换。
配置多个 server 块,按域名绑定独立根目录
每个语言子域对应一个 server 块,通过 server_name 匹配域名,再用 root 指向对应语言的静态文件目录。这是最清晰、最易维护的方式。
- 确保 DNS 已将所有子域(
zh.example.com、en.example.com等)解析到该服务器 IP - 每个
server块监听 80(HTTP)或 443(HTTPS),建议启用 HTTPS 并配置证书 - 目录权限需开放给 Nginx 用户(通常是
www-data或nginx)读取
示例配置片段:
server {
listen 80;
server_name zh.example.com;
root /var/www/zh;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
<p>server {
listen 80;
server_name en.example.com;
root /var/www/en;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}</p>用 map 指令统一管理,减少重复配置
当语言站点较多(如支持 10+ 语种)时,为每个域名写一个 server 块会显得冗余。可改用 map 提前映射域名到目录路径,再在单个 server 块中复用。
-
map必须定义在http块顶层,不能放在server内 - 未匹配的域名可设默认路径(如返回 444 或跳转到主站)
- 路径变量(如
$lang_root)可在后续server中直接用于root
示例:
http {
map $host $lang_root {
default /var/www/default;
zh.example.com /var/www/zh;
en.example.com /var/www/en;
ja.example.com /var/www/ja;
ko.example.com /var/www/ko;
}
<pre class="brush:php;toolbar:false;">server {
listen 80;
server_name ~^(?<subdomain>.+)\.example\.com$;
root $lang_root;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}</subdomain>}
处理静态资源与跨语言跳转逻辑
多语言站点常需在页脚或顶部提供语言切换链接(如「English|中文|日本語」)。这些链接应指向对应子域的相同路径,例如当前在 zh.example.com/product,点「English」应跳转到 en.example.com/product。
- 前端可通过 JavaScript 读取
window.location.pathname拼接新域名,但更推荐服务端生成(如模板中注入{{ current_path }}) - 避免用相对路径跳转(如
/en/product),那属于路径级多语言,和本文的域名级方案冲突 - 如需 SEO 友好,应在 HTML
中添加hreflang标签,明确各语言版本关系
补充:HTTPS 与证书配置要点
生产环境必须启用 HTTPS。若使用 Let’s Encrypt,推荐用 certbot 的 --expand 参数一次性为所有子域申请通配符或多个域名证书。
- 通配符证书(
*.example.com)适合大量子域,但需 DNS 验证 - 多域名证书(
-d zh.example.com -d en.example.com -d ja.example.com)更灵活,HTTP 验证即可 - Nginx 中用
ssl_certificate和ssl_certificate_key指向证书文件,并开启 HSTS 增强安全
配置 HTTPS server 示例:
server {
listen 443 ssl http2;
server_name en.example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
root /var/www/en;
# …其余同 HTTP 配置
}










