A maneira recomendada provavelmente seria usar a map, também porque essas variáveis são avaliadas apenas quando são usadas.
Também return 301 ...é preferível o uso de reescritas, porque nenhuma expressão regular precisa ser compilada.
Aqui um exemplo de onde host e user-agent como uma cadeia concatenada são comparados a uma única regex:
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;
}
}
E isso pode ser ainda mais flexível, por exemplo, se não houver 2, mas mais domínios envolvidos.
Aqui nós mapear www.domain.comcom user-agents começando com Agenta http://www.domain2.come www.domain2.comcom a exata user-agent Other Agentpara 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;
}
}
Nota: você precisará do nginx 0.9.0 ou superior para que a sequência concatenada no mapa funcione.