我想在横幅中创建一个链接以重定向到两个页面之一。该链接指向
subdomain.example.com/email
。如果浏览器语言是“de”,则转到 www.example.de/banner
,否则转到 www.example.com/banner
。我的 nginx conf 语言能力不好,但我知道任何德语浏览器语言的前两个字符都是“de”(参见https://www.metamodpro.com/browser-language-codes)。没有其他语言有这个。
location /email {
if $http_accept_language === "de" { return 301 https://www.example.de/banner }
else { return 301 https://www.example.com/banner}
}
更干净且可扩展的解决方案使用
map
指令。
例如:
map $http_accept_language $redirect {
default https://www.example.com/banner;
~de https://www.example.de/banner;
}
server {
...
location /email {
return 301 $redirect;
}
...
}
请参阅此文档了解详细信息。
类似的用例,其中区域设置由浏览器确定。仅提供两种语言,因此我使用
http_accept_language
来实现此目的。已定义标准语言,在本例中为英语。
map $http_accept_language $lang {
default en;
~de de;
}
server {
...
rewrite ^/$ /$lang/ redirect;
...
}
重新加载配置后,可以使用curl检查行为。
curl -I https://www.your-site.com/ -H "Accept-Language: fr"
curl -I https://www.your-site.com/ -H "Accept-Language: de-CH"
curl -I https://www.your-site.com/ -H "Accept-Language: en-US"
现在测试服务器响应,标头参数
location
现在根据 Accept-Language
显示正确的后缀。
location: https://www.your-site.com/en/
简短说明,
Accept-Language
允许使用q-list
进行列表,例如de, en-US;q=0.9, es;q=0.1
。上面的配置不支持这个。就我而言,这根本没有必要。
https://www.w3.org/International/questions/qa-accept-lang-locales.en
避免使用
map
,它将变量暴露给所有虚拟主机(http 上下文),并将其范围限制在您感兴趣的范围内。
location ~ ^/email {
# Initialize default redirect variable locally
set $url_redirect https://www.example.com/banner;
# Set redirect based on Accept-Language header
if ($http_accept_language ~* ^de) {
set $url_redirect https://www.example.de/banner;
}
# Perform redirect if the variable is set
return 301 $url_redirect;
}