nginx conf/w同一变量的多个映射

nginx conf/w同一变量的多个映射,nginx,Nginx,我们有一个多站点设置,需要将域和域/子文件夹映射到一个变量。这样,编程就知道要加载哪个版本 我们的存储区有单独的域,可以由$http\u host和domain.com//string-locale-here捕获,并由$http\u host$uri和匹配命令捕获 不知何故,下面的代码不起作用。这可能是因为有两个映射命令,都映射到同一个变量$storecode 或者可能出了什么问题 map $http_host $storecode { default dom_nl; domain.com

我们有一个多站点设置,需要将域和域/子文件夹映射到一个变量。这样,编程就知道要加载哪个版本

我们的存储区有单独的域,可以由
$http\u host
和domain.com//string-locale-here捕获,并由
$http\u host$uri
和匹配命令捕获

不知何故,下面的代码不起作用。这可能是因为有两个映射命令,都映射到同一个变量
$storecode

或者可能出了什么问题

map $http_host $storecode {
 default dom_nl;
 domain.com dom_nl;
 domain.de dom_de;
 store.com str_de;
 }

map $http_host$uri $storecode { 
  ~^store.com/en.* str_en;
  ~^store.com/fr.* str_fr;
}

当地图块中未指定
default
时,默认结果值将为空字符串。因此,在您的示例中,无论第一个映射块中设置了什么值
$storecode
,第二个映射块中的值都将替换为空字符串

由于使用映射变量时会对其进行求值,因此不能在第二个映射块中将
$storecode
设置为默认值,因为这将导致无限循环

因此,解决方案是在第一个地图块中引入一个临时变量,然后在第二个地图块中将其用作默认值:

map $host $default_storecode {
    default dom_nl;
    domain.com dom_nl;
    domain.de dom_de;
    store.com str_de;
}

map $host$uri $storecode {
    default $default_storecode;

    ~^store.com/en.* str_en;
    ~^store.com/fr.* str_fr;
}
或者,可以将这两个地图块合并为一个:

map $host$uri $storecode {
    default           dom_nl;

    ~^domain.com.*    dom_nl;
    ~^domain.de.*     dom_de;

    ~^store.com/en.*  str_en;
    ~^store.com/fr.*  str_fr;
    ~^store.com.*     str_de;
}