Nginx: entorno de desarrollo y producción en función de la ip u otros parámetros

Hace poco se dio el caso de que necesité tener bajo un mismo dominio 2 entornos: uno para el público en general y otro para que los programadores pudieran probar la nueva web sobre el mismo dominio.

La forma mas sencilla es tener las dos webs en dos rutas diferentes y asignar el root en función de una variable.

set $ruta_root  "/ruta_de/midominio.com/httpdocs";
 
if ($remote_addr ~* "xx.xx.xx.xx|yy.yy.yy.yy") {
  set $ruta_root  "/ruta_de/midominio.com/httpdocs_desarrollo";
}
root $ruta_root;

Esto mismo se puede hacer en otros muchos casos, por ejemplo si queremos que todas las visitas de un bot muestren otra web:

set $ruta_root  "/ruta_de/midominio.com/httpdocs";
if ($http_user_agent ~ "Indy Library") {
  set $ruta_root  "/ruta_de/midominio.com/httpdocs_desarrollo";
}
root $ruta_root;

O también mostrar otra web a los visitantes de un país o zona geográfica con el módulo de geopip.

set $ruta_root  "/ruta_de/midominio.com/httpdocs";
if ($geoip_city_country_code = "RU") {
  set $ruta_root  "/ruta_de/midominio.com/httpdocs_desarrollo";
}
root $ruta_root;