2012-03-06 17 views
12

La documentación de nginx dice que el server_name directive admite expresiones regulares. He estado golpeando mi cabeza contra la pared tratando de hacer funcionar una expresión regular trivial.Redirigir un subdominio con una expresión regular en nginx

Quiero http://subdomain.mydomain.com para redirigir a http://mydomain.com/subdomain

Aquí está mi código.

server { 
    server_name "~^subdomain\.mydomain\.com$"; 
    rewrite^http://mydomain.com/subdomain; 
} 

También, potencialmente notable. Más abajo en el archivo de configuración nginx hay una regla:

server { 
    server_name *.mydomain.com 
    ... 
} 

¿Qué estoy haciendo mal?

ACTUALIZACIÓN:

Se ha sugerido que no lo uso de expresiones regulares para esto ... para ofrecer un poco más de claridad: la expresión regular trivial era simplemente para fines de resolución de problemas. La expresión regular real se verá más como ...

server { 
    server_name "~^.*(cvg|cincinnati)\.fakeairport(app)?\.(org|com)$"; 
    rewrite^http://fakeairport.com/cincinnati; 
} 

server { 
    server_name "~^.*(lex|lexington)\.fakeairport(app)?\.(org|com)$"; 
    rewrite^http://fakeairport.com/lexington; 
} 

Por lo tanto, sería preferible usar regex.

+0

no tiene idea acerca de nginx, pero ¿por qué hay una tilde al comienzo de la expresión regular? – sweaver2112

+0

La tilde líder le dice a nginx que esta es una expresión regular. – danott

Respuesta

26

para responder a una pregunta histórica para ayudar a otros

usando nginx 1.1.19 se puede hacer lo siguiente:

server { 
    server_name  ~^(?<subdomain>\w+)\.domainA\.com$; 

    location/{ 
      rewrite^https://$subdomain.domainB.com$request_uri permanent; 
    } 
} 

El subdominio antes domainA.com se adapta y se almacena en la variable $ subdominio que luego se puede usar en la reescritura Esto reescribe url como xxx.domainA.com a xxx.domainB.com con solo una directiva de servidor.

+0

Gracias, hombre, me ayudó. –

0

Sé que todo el mundo está diciendo si es malo en los archivos de configuración de nginx, pero a veces no puedes moverte de otra forma.

server { 
     server_name .mydomain.com; 

     if ($host ~ subdomain.mydomain.com) { 
       rewrite ^(.*) http://mydomain.com/subdomain$1; 
     } 
} 
+2

NUNCA DEBE usar un if cuando no sea necesario. Eso es solo pedir problemas. – MTeck

+1

Correcto, pero como implica, hay situaciones en las que es necesario y si se configura correctamente (con comandos de reescribir solo el módulo) es perfectamente seguro de usar. El problema con "si" no es que NO deba usarse, sino que se use con comprensión. – Dayo

+5

Realmente me estoy cansando de que la mayoría de la gente diga "NUNCA USE SI". ¿Por qué en el mundo incluso se implementa, si está prohibido usarlo? – petermolnar

3

Si usted lee la server_name matching rules, verá que prefijo y sufijo server_names se comprueban antes de los nombres de expresiones regulares, pero después de los nombres de host exactas. Dado que * .midominio.com coincide, la expresión regular no se prueba. El hecho de que esté enumerado anteriormente en la configuración no hace diferencia. Dado que solo intenta hacer coincidir un solo nombre de host con su expresión regular, un simple:

server { 
    server_name subdomain.mydomain.com; 
    rewrite^http://mydomain.com/subdomain$request_uri?; 
} 

server { 
    server_name *.mydomain.com; 

    # stuff 
} 

funcionará para usted.

+0

La expresión regular trivial era simplemente para solucionar problemas. Se agregaron más detalles sobre por qué necesito usar una expresión regular a la pregunta original. – danott

+0

Ah, debería haberme dado cuenta de eso. ¿Para qué estás usando el dominio de sufijo? Mientras lo tenga, ningún servidor regex coincidirá con ese sufijo. – kolbyjack

+0

La arquitectura de nuestra aplicación solía usar una tonelada de subdominios, por lo que se usa como una herramienta para redirigir cualquier subdominio adicional que no tenga un redireccionamiento específico. – danott

9

¡Tengo que querer regex con NGINX!

Como trabajo a menudo con varios nombres de dominio y me gusta mantener mis configuraciones lo más limpias y sólidas posible, casi siempre uso expresiones regulares con nginx.

En este caso he resuelto con la siguiente expresión regular:

server { 
    listen 80; 
    server_name ~^((?<subdomain>.*)\.)(?<domain>[^.]+)\.(?<tld>[^.]+)$; 
    return 301 $scheme://${domain}.${tld}; 
} 

Lo que esto hace es la siguiente: cada subdomain.domain-name.tld que apunta a este servidor (dirección IP) será redirigido al domain-name.tld.

Por ejemplo, www.myexampledomain.com se redirige a myexampledomain.com.

Para responder a la pregunta, lo que también podría hacer es la siguiente:

server { 
    listen 80; 
    server_name ~^((?<subdomain>.*)\.)(?<domain>[^.]+)\.(?<tld>[^.]+)$; 
    return 301 $scheme://${domain}.${tld}/${subdomain}; 
} 

Ahora mysubdomain.myexampledomain.com se convierte en myexampledomain.com/mysubdomain.

Above regex es genial, ya que puede tirar cualquier cosa que desee y lo convertirá para usted.

+1

¡Las capturas de RegEx en 'server_name' en sus ejemplos son asombrosamente útiles! Una ventaja fantástica fue que pude definir dinámicamente una ruta compartida de 'raíz' cortando el subdominio de la siguiente manera: 'root \t /home/www-data/$domain.$tld/;' Su respuesta utiliza técnicas mucho más modernas y debe actualizarse a la respuesta aceptada. – FactoryAidan

0

Solo como comentario. Si desea redirigir todos los niveles de subdominios a primer nivel de subdominio, util cuando se utiliza un certificado SSL comodín por ejemplo, que puede usar:

server { 
    listen 80; 
    server_name ~^(.*)\.(?<subdomain>\w+).mydomain\.com$; 
    return   301 https://$subdomain.mydomain.com$request_uri; 
} 

server { 
    listen 80; 
    server_name ~^(?<subdomain>\w+).mydomain\.com$; 
    return   301 https://$subdomain.mydomain.com$request_uri; 
} 

La primera es para redirigir una http subdominio de nivel múltiple para el primer nivel de subdominio en https. Y el siguiente es para redirigir el subdominio de primer nivel en http al mismo subdominio en https.

Cuestiones relacionadas