2010-02-12 5 views
6

J'ai actuellement la règle de réécriture (hacky) suivante dans mon fichier nginx.conf pour permettre à des sous-domaines dynamiques d'être redirigés vers une instance de Django.Règles de réécriture nginx complexes pour les sous-domaines

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; 
} 

Je suis sûr qu'il ya un moyen plus efficace de le faire, mais je dois changer cette règle afin que toute demande à *.domain.com/media/* ou *.domain.com/downloads/* vont domain.com/media/* et domain.com/downloads/*.

Répondre

8

En fait, je pense qu'il est beaucoup plus facile de changer les règles de réécriture nginx que d'écrire middleware pour django pour ce faire. Après avoir lu comment nginx traite sa localisation (le plus exact -> le moins exact) j'ai créé des emplacements pour/media et/download ainsi qu'un emplacement pour/I, puis j'ai déplacé la règle de réécriture sous/et l'ai simplifiée - que je ne suis plus inquiet pour la vérification des fichiers, car cet endroit est passé en entier django - la règle devient:

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

et serait probablement encore plus simple si mon nginx \ script regex était mieux :)

+0

Bonjour @Frozenskys J'ai une question [ici] (http://stackoverflow.com/questions/18744741/setting-up-nginx-reverse-proxy-for-s3 -hosted-sites Web) .Je ne suis pas sûr de savoir comment configurer mon serveur proxy.Si possible, s'il vous plaît donner vos entrées. – KillABug

0

Peut-être une meilleure idée serait de configurer django pour gérer les sous-domaines au lieu d'ajouter une réécriture dans votre serveur web. Voici comment je l'ai fait: http://sharjeel.2scomplement.com/2008/07/24/django-subdomains/

+0

Bonjour @sharjeel J'ai une question [ici] (http://stackoverflow.com/questions/18744741/setting-up-nginx-reverse-proxy-for-s3-hosted-websites) .Je ne suis pas sûr comment configurer mon serveur proxy.Si possible, s'il vous plaît donner vos entrées – KillABug

9

Vous pouvez utiliser des noms de serveur d'expressions régulières (voir http://nginx.org/en/docs/http/server_names.html#regex_names) et affecter directement un groupe correspondant à un sous-domaine $ variable:

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

Merci! C'est la meilleure façon, car en utilisant si nginx n'est pas recommandé (lire plus: [NGINX si est le mal] (https://www.nginx.com/resources/wiki/start/topics/depth/ifisevil/) – antoniOS

+0

Utilisation de si en nginx est bien aussi longtemps que vous comprenez ce qu'il fait. "La directive si elle a des problèmes _lorsqu'elle est utilisée dans un contexte de localisation, dans certains cas, elle ne fait pas ce que vous attendez, mais quelque chose de complètement différent à la place. - https://www.nginx.com/resources/wiki/start/topics/depth/ifisevil/ –

Questions connexes