WEBKT

Nginx配置技巧:根据浏览器语言自动跳转中英文网站

73 0 0 0

很多时候,我们需要根据用户的浏览器语言设置,自动将他们导向对应语言版本的网站,提升用户体验。比如,当用户浏览器设置为中文时,自动跳转到中文网站;否则,跳转到英文网站。这个功能可以通过 Nginx 配置轻松实现。

实现原理

Nginx 可以通过 $http_accept_language 变量获取客户端浏览器发送的 Accept-Language 请求头。这个请求头包含了用户期望的语言偏好设置。我们可以利用 Nginx 的 if 指令,根据 $http_accept_language 的值来进行判断,并使用 rewrite 指令进行跳转。

注意: 尽量避免在 Nginx 中过多使用 if 指令,因为它可能会影响性能。对于复杂的逻辑,可以考虑使用 Lua 脚本。

配置步骤

  1. 编辑 Nginx 配置文件

打开你的 Nginx 配置文件,通常位于 /etc/nginx/nginx.conf/etc/nginx/conf.d/default.conf。找到你的 server 块,然后进行修改。

  1. 添加配置代码

server 块中添加以下代码:

server {
    listen 80;
    server_name yourdomain.com;

    # 默认英文网站
    root /var/www/yourdomain.com/en;
    index index.html index.htm;

    location / {
        if ($http_accept_language ~* "zh-cn") {
            rewrite ^(.*)$ /cn$1 break;
        }
        # 其他语言,默认英文
    }

    location /cn {
        root /var/www/yourdomain.com;
        index index.html index.htm;
        # 移除 /cn 前缀
        rewrite ^/cn(.*)$ $1 break;
    }
}

配置代码解释:

  • listen 80;: 监听 80 端口。
  • server_name yourdomain.com;: 你的域名。
  • root /var/www/yourdomain.com/en;: 默认的英文网站根目录。
  • index index.html index.htm;: 默认的首页文件。
  • location / { ... }: 匹配所有请求。
  • if ($http_accept_language ~* "zh-cn") { ... }: 如果 Accept-Language 请求头包含 zh-cn(不区分大小写),则执行 rewrite 指令。
  • rewrite ^(.*)$ /cn$1 break;: 将所有请求重写到 /cn 路径下,break 表示停止继续匹配其他 location
  • location /cn { ... }: 处理 /cn 路径下的请求。
  • root /var/www/yourdomain.com;: 中文网站的根目录。
  • rewrite ^/cn(.*)$ $1 break;: 移除 URL 中的 /cn 前缀,例如将 /cn/about 重写为 /about
  1. 创建网站目录和文件

确保你已经创建了相应的网站目录,并放置了中英文版本的网站文件。

mkdir -p /var/www/yourdomain.com/en
mkdir -p /var/www/yourdomain.com

# 英文网站文件,例如 index.html
echo "<h1>Welcome to English version!</h1>" > /var/www/yourdomain.com/en/index.html
# 中文网站文件,例如 index.html
echo "<h1>欢迎来到中文版!</h1>" > /var/www/yourdomain.com/index.html
  1. 检查 Nginx 配置并重启

在修改 Nginx 配置后,务必检查配置文件的语法是否正确,然后重启 Nginx 服务。

nginx -t
systemctl restart nginx

优化配置(推荐)

为了提高性能和可维护性,可以考虑使用 map 指令来替代 if 指令。map 指令允许你根据变量的值来映射到不同的值,从而避免使用多个 if 语句。

http {
    map $http_accept_language $lang {
        default en;
        ~*zh-cn cn;
    }

    server {
        listen 80;
        server_name yourdomain.com;

        root /var/www/yourdomain.com/$lang;
        index index.html index.htm;

        location / {
            try_files $uri $uri/ =404;
        }
    }
}

配置代码解释:

  • map $http_accept_language $lang { ... }: 定义一个 map,将 $http_accept_language 的值映射到 $lang 变量。
  • default en;: 默认语言为英文。
  • ~*zh-cn cn;: 如果 $http_accept_language 包含 zh-cn,则 $lang 的值为 cn
  • root /var/www/yourdomain.com/$lang;: 网站根目录根据 $lang 变量动态设置。

注意事项

  • 确保你的网站目录结构正确,并且包含了对应语言版本的网站文件。
  • Accept-Language 请求头可能包含多个语言偏好设置,你可以根据实际情况进行更精确的匹配。
  • 这种方法依赖于客户端浏览器发送的 Accept-Language 请求头,有些用户可能会禁用或修改这个设置。
  • 可以使用 Nginx 的日志功能来监控跳转情况,以便及时发现和解决问题。
  • 如果你的网站使用了缓存,请确保缓存配置正确,避免缓存导致语言跳转失效。

总结

通过以上配置,你可以轻松实现根据浏览器语言自动跳转中英文网站的功能。使用 map 指令可以提高配置的可维护性和性能。记得根据你的实际情况修改配置,并进行充分的测试。希望这个教程能帮助到你!

参考资料:

WebDev Pro Nginx语言跳转网站配置

评论点评