如何根据客户端浏览器的语言在 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;
}
}