Nginx为捷克语用户配置不同首页失败求助
Nginx根据浏览器语言加载对应首页问题解决
需要为捷克语访客展示专属首页index-cs.html,参考相关配置并查阅手册后,配置始终返回默认index.html,未达到预期效果。当前环境为Debian系统,使用nginx-full版本。
现有配置代码
map $http_accept_language $lang { default en; ~*cs.* cs; ~*cs-CZ.* cs; ~*^cs cs; } server { listen 80; server_name lelisoft.com www.lelisoft.com; root /var/www/lelisoft.com; index index.html; location / { try_files $uri $uri/ /index-$lang.html /index.html; } }
测试命令及结果
curl -v -H "Accept-Language: cs" http://www.lelisoft.com * Trying 162.55.54.132:80... * Connected to www.lelisoft.com (162.55.54.132) port 80 (#0) > GET / HTTP/1.1 > Host: www.lelisoft.com > User-Agent: curl/8.0.1 > Accept: */* > Accept-Language: cs < Content-Length: 473 < Last-Modified: Sun, 25 Jun 2023 09:03:01 GMT < <!DOCTYPE html> <html lang='eng'> <head>
问题排查与解决方案
问题根源在于index指令优先级高于try_files:当访问根路径/时,Nginx会优先执行index index.html直接返回默认首页,不会触发try_files里的/index-$lang.html规则。
修改步骤
- 调整index指令优先级
将带语言标识的首页放在index指令首位,让Nginx优先尝试加载对应语言的首页:
map $http_accept_language $lang { default en; ~*cs.* cs; ~*cs-CZ.* cs; ~*^cs cs; } server { listen 80; server_name lelisoft.com www.lelisoft.com; root /var/www/lelisoft.com; # 优先匹配对应语言首页,不存在则回退到默认index.html index index-$lang.html index.html; location / { try_files $uri $uri/ =404; } }
- 简化map规则(可选)
合并重复的正则匹配模式,让配置更简洁:
map $http_accept_language $lang { default en; ~*cs(-CZ)? cs; }
该正则会匹配任意包含cs或cs-CZ的语言头,效果与原规则一致。
- 重新加载Nginx配置
sudo nginx -s reload
修改后再次用curl测试,即可返回index-cs.html内容。
内容的提问来源于stack exchange,提问作者Leos Literak
相关产品推荐
相关产品推荐

