Рекомендуемый способ, вероятно, будет использовать, а mapтакже потому, что эти переменные оцениваются только тогда, когда они используются.
Кроме того, использование return 301 ...предпочтительнее, чем перезапись, потому что регулярное выражение не нужно компилировать.
Вот пример, где хост и пользовательский агент в виде объединенной строки сравниваются с одним регулярным выражением:
map "$host:$http_user_agent" $my_domain_map_host {
default 0;
"~*^www.domain.com:Agent.*$" 1;
}
server {
if ($my_domain_map_host) {
return 302 http://www.domain2.com$request_uri;
}
}
И это может быть еще более гибким, например, если задействовано не 2, а несколько доменов.
Здесь мы отображаем www.domain.comс пользователем агенты , начиная с Agentк http://www.domain2.comи www.domain2.comс точным агентом пользователя Other Agentдля http://www.domain3.com:
map "$host:$http_user_agent" $my_domain_map_host {
default 0;
"~*^www.domain.com:Agent.*$" http://www.domain2.com;
"~*^www.domain2.com:Other Agent$" http://www.domain3.com;
}
server {
if ($my_domain_map_host) {
return 302 $my_domain_map_host$request_uri;
}
}
Примечание: вам понадобится nginx 0.9.0 или выше, чтобы конкатенированная строка в карте работала.