我们有多站点设置,需要将域和域/子文件夹映射到变量。这样编程就知道要加载哪个版本。
我们的商店拥有独立的域名,可以由$http_host
捕获,也可以通过domain.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;
}
答案 0 :(得分:14)
如果未在地图块中指定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;
}