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

snh*_*_nl 3 nginx

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

我们的商店有独立的域名,可以通过$http_hostdomain.com/-string-locale-here-捕获,$http_host$uri并通过匹配命令捕获

不知怎的,以下不起作用.这可能是因为有两个map命令,都映射到同一个变量$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;
}
Run Code Online (Sandbox Code Playgroud)

Iva*_*lev 15

如果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;
}
Run Code Online (Sandbox Code Playgroud)

或者,您可以将这两个地图块合并为一个:

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;
}
Run Code Online (Sandbox Code Playgroud)