Nginx多语言站点配置适配海外访客访问
为什么需要配置多语言站点
如果你的网站有来自不同国家的访客,让浏览器自动切换语言版本可以显著提升体验。
比如在 Nginx 上配置多语言站点,访客从海外访问时直接跳转到英文页面,国内用户看到中文页面。
下面我用最直接的步骤带你完成配置,无需复杂开发经验。
准备工作
你需要先确认以下条件:
- 一台服务器:安装好 Nginx(建议 1.18+ 版本),可以用宝塔面板或直接命令行操作。
- 已解析的域名:比如
example.com,并且你已经在 Nginx 里配置了基本的 server 块。 - 准备多语言内容:假设你已把不同语言的页面放在不同目录下,例如:
/var/www/example/en/(英文)/var/www/example/zh/(中文)/var/www/example/ja/(日文)
如果还没有准备好目录,先创建并放好对应语言的文件。
方案一:基于 URL 路径区分语言
这是最常见的做法,访客通过 example.com/en/、example.com/zh/ 访问不同语言。
Nginx 配置很简单:
server {
listen 80;
server_name example.com;
location /en/ {
alias /var/www/example/en/;
try_files $uri $uri/ /en/index.html;
}
location /zh/ {
alias /var/www/example/zh/;
try_files $uri $uri/ /zh/index.html;
}
location /ja/ {
alias /var/www/example/ja/;
try_files $uri $uri/ /ja/index.html;
}
location / {
# 默认使用中文
rewrite ^/$ /zh/ permanent;
}
}
注意:alias 和 try_files 配合时,try_files 的参数路径要基于 alias 后的实际目录路径写,否则可能 404。
上面示例已做调整。
方案二:基于子域名(适合大型站点)
用 en.example.com、zh.example.com 等,然后用不同的 server 块分别配置。
配置片段:
server {
listen 80;
server_name en.example.com;
root /var/www/example/en;
index index.html;
}
server {
listen 80;
server_name zh.example.com;
root /var/www/example/zh;
index index.html;
}
这种方法需要提前做好子域名的 DNS 解析。
根据访客语言自动重定向(关键步骤)
上面两种方案只能让用户手动切换,下面用 Nginx 的 map 指令根据 Accept-Language 请求头自动跳转到对应语言版本,适合零基础用户复制。
在 Nginx 配置文件的 http 块(通常在 /etc/nginx/nginx.conf)中添加:
map $http_accept_language $lang {
default zh;
~*^en en;
~*^ja ja;
~*^zh zh;
}
然后在 server 块中用如下判断实现自动跳转(假设你使用方案一的路径结构):
server {
listen 80;
server_name example.com;
root /var/www/example;
# 首页自动重定向
location = / {
if ($lang !~* ^zh) {
rewrite ^ /$lang/ permanent;
}
# 中文用户直接访问默认目录
rewrite ^ /zh/ permanent;
}
location /en/ {
alias /var/www/example/en/;
try_files $uri $uri/ /en/index.html;
}
location /zh/ {
alias /var/www/example/zh/;
try_files $uri $uri/ /zh/index.html;
}
location /ja/ {
alias /var/www/example/ja/;
try_files $uri $uri/ /ja/index.html;
}
}
解释:
map指令将Accept-Language头部映射为语言代码,例如浏览器发送en-US,en;q=0.9,则匹配到en。location = /处理首页,如果检测到非中文语言就 301 重定向到对应路径。- 中文用户直接重定向到
/zh/。
注意:if 在 location 里性能影响极小,用于首页重定向没问题。
如果你担心,可以用 return 301 替代 rewrite。
配置完成后重载 Nginx
配置修改后执行:
nginx -t # 测试配置语法
systemctl reload nginx # 重载生效
验证方法
使用 curl 模拟不同语言访问:
# 模拟英文浏览器
curl -H "Accept-Language: en-US" -I http://example.com/
# 返回的 Location 应指向 /en/
# 模拟中文浏览器
curl -H "Accept-Language: zh-CN" -I http://example.com/
# 返回的 Location 应指向 /zh/
# 模拟日文浏览器
curl -H "Accept-Language: ja" -I http://example.com/
# 返回的 Location 应指向 /ja/
浏览器测试:用无痕窗口设置首选语言后访问首页,观察地址栏跳转。
常见问题与避坑
1. 重定向循环
如果发现一直跳转,检查默认语言路径是否被当作非默认语言再次重定向。建议在 location /zh/ 里也加上内部 rewrite 保证不循环。简单做法:用 try_files 直接提供内容,不触发外部跳转。
2. 浏览器发送的 Accept-Language 格式多样
map 中的正则 ~*^en 只匹配以 en 开头的语言代码(忽略大小写)。如果有些浏览器发送 en-gb 也能匹配,但如果你只需要精确匹配可以写更严格的正则。
3. 使用宝塔面板的用户
宝塔的 Nginx 配置在 /www/server/panel/vhost/nginx/ 下,直接在对应站点配置文件中添加 map 和跳转规则即可。注意 map 必须放到 http 块内,普通用户可先备份原配置,然后在宝塔面板的“配置修改”中找到顶部 http { 的结束位置前插入 map 代码。
4. SEO 注意事项
使用 301 重定向告知搜索引擎不同语言的对应关系,但不要滥用。建议同时添加 标签到每一页的 HTML 头部。
写在最后
通过上述步骤,你已经能用 Nginx 为海外访客配置多语言站点,让他们自动访问适合自己的语言版本。
实际部署时注意根据你的目录结构和语言数量微调 map 和 location 规则。
如果在配置过程中遇到 404 或循环重定向,优先检查路径和重写规则,并用 nginx -t 验证语法。