nginxconf 文件:检测浏览器语言是否为“de”,然后重定向到页面....否则重定向到其他页面

问题描述 投票:0回答:3

我想在横幅中创建一个链接以重定向到两个页面之一。该链接指向

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}
}
nginx http-redirect nginx-config
3个回答
4
投票

更干净且可扩展的解决方案使用

map
指令。

例如:

map $http_accept_language $redirect {
    default    https://www.example.com/banner;
    ~de        https://www.example.de/banner;
}

server {
    ...
    location /email {
        return 301 $redirect;
    }
    ...
}

请参阅此文档了解详细信息。


0
投票

类似的用例,其中区域设置由浏览器确定。仅提供两种语言,因此我使用

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


0
投票

避免使用

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;
}
© www.soinside.com 2019 - 2024. All rights reserved.