Skip to main content
 首页 » 编程设计

browser之如何根据客户端浏览器的语言在 nginx 中重写位置

2024年11月24日24lyj

如何根据客户端浏览器的语言在 nginx 中重写位置?

例如:
我的浏览器接受语言是 'uk,ru,en'。
当我请求位置 mysite.org 时,nginx 必须转发到 mysite.org/uk

请您参考如下方法:

使用 AcceptLanguageModule 的缺点是您不能再依赖自动系统更新。每次 nginx 更新(甚至是安全更新),你都必须自己编译 Nginx。
第二个缺点是该模块假定接受语言已经按质量值排序。
我更喜欢 Lua,因为它可以在基于 debian 的发行版中轻松安装:

apt-get install nginx-extras 

我的同事 Fillipo 做得很棒 nginx-http-accept-lang Lua 中的脚本。它正确处理质量值并相应地重定向用户。
我做了 small modification到那个脚本。它接受支持的语言作为输入参数,并根据 Accept-Language header 返回最合格的语言。使用返回值,您可以做任何您想做的事情。它可用于重写、设置 lang cookie ...

我仅将语言确定用于根路径(位置 =/)。并且用户 lang cookie 优先于浏览器。
我的 nginx 配置文件如下所示:
map $cookie_lang $pref_lang { 
    default ""; 
    ~en en; 
    ~sk sk; 
} 
 
server { 
    listen 80 default_server; 
 
    root /usr/share/nginx/html; 
    index index.html index.htm; 
 
    # Make site accessible from http://localhost/ 
    server_name localhost; 
 
    location = / { 
        # $lang_sup holds comma separated languages supported by site 
        set $lang_sup "en,sk"; 
        set_by_lua_file $lang /etc/nginx/lang.lua $lang_sup; 
        if ($pref_lang) { 
            set $lang $pref_lang; 
        } 
        add_header Set-Cookie lang=$lang; 
        rewrite (.*) $scheme://$server_name/$lang$1; 
    } 
 
    location / { 
        # First attempt to serve request as file, then 
        # as directory, then fall back to displaying a 404. 
        try_files $uri $uri/ =404; 
   } 
}