Cómo configurar la ruta raíz de nginx según el host

Cómo configurar la ruta raíz de nginx según el host

¿Cómo puedo configurar que un host visitante utilice una ruta raíz específica en nginx?

El visitante con IP 1.1.1.1 utilizará

root /srv/web1

todos los demás visitantes utilizarán

root /srv/web2

Respuesta1

Si bien esta pregunta se responde fácilmente simplemente investigando un poco y leyendo la documentación (preferiblemente comenzando desde elGuía para principiantesy luegoCómo nginx procesa una solicitud), lo responderé de todos modos.

Supongo que tiene un servidor con más de una interfaz de red y dirección IP, donde la dirección 1.1.1.1 se asigna a una interfaz y otras direcciones a sus respectivas interfaces.

Nginx es muy flexible en este sentido, de hecho, siempre hay un serverbloque que se usa por defecto cuando nginx no puede coincidir con ningún otro bloque del servidor server_name: ese es el primer serverbloque del archivo o el que especifica default_serveren su listendirectiva. . Y recuerda quepuedes especificar una IP en la listendirectiva.

Eso significa, en su caso:

server {
    listen 80 default_server;
    root /srv/web2;
    [...]
}
server {
    listen 1.1.1.1:80;
    root /srv/web1;
    [...]
}

Como puede ver en el ejemplo anterior, el primer serverbloque escucha en todas las interfaces en el puerto 80, mientras que el segundo bloque escucha solo en la interfaz 1.1.1.1, en el puerto 80. Por lo tanto, cualquiera que visite su sitio a través de la interfaz de red 1.1.1.1 recibirá archivos de /srv/web1, independientemente del campo Host en la solicitud HTTP (es decir, el nombre de dominio escrito en la barra de URL).

Se puede obtener otro comportamiento similar poniendo la dirección IP en la server_namedirectiva, así:

server {
    listen 80;
    server_name 1.1.1.1;
    [...]
}
* Tenga en cuenta que este último serverbloque solo detecta solicitudes a la dirección IP literal y no a nombres de dominio.

Espero que esto responda a su pregunta, pero la próxima vez proporcione información adicional sobre su configuración actual e investigue un poco.

Actualizar

Para obtener el comportamiento descrito puede utilizar elgeomódulocomo se explica enesta pregunta:

geo $client {
    default web2;
    1.1.1.1 web1;
}
server {
    [...]
    root /srv/$client;
    [...]
}
Esta configuración utiliza elgeomódulo para establecer una variable ( $client) basada en la dirección IP del cliente. Esa variable se establece en el valor predeterminadoweb2o el específicoweb1y luego se sustituye en la rootdirectiva.

Tenga en cuenta que la geodirectiva debe estar dentro del httpbloque y no serveren bloques; El fragmento anterior debería funcionar tal cual, pero no garantizo nada ya que no lo probé.

información relacionada