2010-02-12 22 views
6

Actualmente tengo la siguiente regla (hacky) de reescritura en mi nginx.conf para permitir que los subdominios dinámicos sean redirigidos a una instancia de Django.Reglas de reescritura complejas de nginx para los subdominios

set $subdomain ""; 
set $subdomain_root ""; 
set $doit ""; 
if ($host ~* "^(.+)\.domain\.com$") { 
    set $subdomain $1; 
    set $subdomain_root "/profile/$subdomain"; 
    set $doit TR; 
} 
if (!-f $request_filename) { 
    set $doit "${doit}UE"; 
} 
if ($doit = TRUE) { 
    rewrite ^(.*)$ $subdomain_root$1; 
    break; 
} 

Estoy seguro de que es una forma más eficiente de hacer esto, pero tengo que cambiar esta regla para que cualquier petición a *.domain.com/media/* o *.domain.com/downloads/* van a domain.com/media/* y domain.com/downloads/*.

Respuesta

8

En realidad, creo que es mucho más fácil cambiar las reglas de reescritura de nginx que escribir middleware para que django haga esto. Después de leer sobre cómo nginx procesa su coincidencia de ubicación (más exacta -> menos exacta), creé ubicaciones para/media y/download, así como una ubicación de catch all para/I luego moví la regla de reescritura a/ubicación y la simplifiqué - como ya no estoy preocupado por la comprobación de archivos debido a que toda esta ubicación se pasa a django - la regla se convierte en:

set $subdomain ""; 
set $subdomain_root ""; 
if ($host ~* "^(.+)\.domain\.com$") { 
    set $subdomain $1; 
    set $subdomain_root "/profile/$subdomain"; 
    rewrite ^(.*)$ $subdomain_root$1; 
    break; 
} 

y probablemente sería aún más simple si mi nginx \ expresiones regulares scripting era mejor :)

+0

Hola @Frozenskys Tengo una pregunta [aquí] (http://stackoverflow.com/questions/18744741/setting-up-nginx-reverse-proxy-for-s3 -hosted-websites). No estoy seguro de cómo configurar mi servidor proxy. Si es posible, proporcione sus entradas. – KillABug

0

Quizás una mejor idea sería configurar django para manejar subdominios en lugar de agregar una reescritura en su servidor web. He aquí cómo lo hice: http://sharjeel.2scomplement.com/2008/07/24/django-subdomains/

+0

Hola @sharjeel Tengo una pregunta [aquí] (http://stackoverflow.com/questions/18744741/setting-up-nginx-reverse-proxy-for-s3-hosted-websites). No estoy seguro cómo configurar mi servidor proxy. Si es posible, proporcione sus entradas – KillABug

9

Puede utilizar los nombres de los servidores de expresiones regulares (consulte http://nginx.org/en/docs/http/server_names.html#regex_names) y asignar un grupo coincidente a un subdomain $ variable directamente:

server { 
    listen 80; 
    listen 443; 
    server_name ~^(?<subdomain>.+)\.domain\.com$ 
    location/{ 
    rewrite^/profile/$subdomain$request_uri; 
    } 
} 
+0

¡Gracias! Es la mejor manera, porque no se recomienda usar if in nginx (leer más: [NGINX If Is Evil] (https://www.nginx.com/resources/wiki/start/topics/depth/ifisevil/)) – antoniOS

+0

Usar si en nginx está bien siempre y cuando entiendas lo que hace. "La directiva si tiene problemas _cuando se usa en contexto de ubicación_, en algunos casos no hace lo que esperas, sino algo completamente diferente en su lugar. En algunos casos incluso segfaults". - https://www.nginx.com/resources/wiki/start/topics/depth/ifisevil/ –

Cuestiones relacionadas