2010-02-12 23 views
6

Mam obecnie następującą (hackowatą) regułę ponownego zapisu w moim pliku nginx.conf, aby umożliwić przekierowanie dynamicznych subdomen do jednej instancji Django.Kompleksowe reguły przepisywania dla subdomeny nginx

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

Jestem pewien, że jest bardziej efektywny sposób to zrobić, ale trzeba zmienić ten przepis tak, że wszelkie wnioski do *.domain.com/media/* lub *.domain.com/downloads/* iść do domain.com/media/* i domain.com/downloads/*.

Odpowiedz

8

Właściwie, myślę, że znacznie łatwiej jest zmienić zasady ponownego zapisywania nginxu niż pisać oprogramowanie pośrednie dla tego django. Po przeczytaniu, w jaki sposób nginx przetwarza dopasowanie lokalizacji (najbardziej dokładne -> najmniej dokładne) utworzyłem lokalizacje dla/media i/download, a także lokalizację catch dla/I, następnie przeniosłem regułę przepisywania do// i uprościłem - jako że nie jestem już martwić o sprawdzanie plików, ponieważ cała ta lokalizacja jest przekazywana do django - zasada staje:

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

i prawdopodobnie będzie jeszcze prostsze, jeśli mój nginx \ regex skryptów było lepiej :)

+0

Witaj @Frozenskys Mam pytanie [tutaj] (http://stackoverflow.com/questions/18744741/setting-up-nginx-reverse-proxy-for-s3 -hosted-websites) .Nie wiem jak skonfigurować serwer proxy. Jeśli to możliwe, proszę podać swoje dane wejściowe. – KillABug

0

Być może lepszym pomysłem byłoby skonfigurowanie django do obsługi subdomen zamiast dodawania przepisywania na swoim serwerze internetowym. Oto, jak to zrobiłem: http://sharjeel.2scomplement.com/2008/07/24/django-subdomains/

+0

Witaj @sharjeel Mam pytanie [tutaj] (http://stackoverflow.com/questions/18744741/setting-up-nginx-reverse-proxy-for-s3-hosted-websites) .Nie jestem pewien jak skonfigurować mój serwer proxy. Jeśli to możliwe proszę podać swoje dane wejściowe – KillABug

9

Można użyć nazw serwerów wyrażeń regularnych (patrz http://nginx.org/en/docs/http/server_names.html#regex_names) i przypisać pasującą grupę do zmiennej subdomeny $ bezpośrednio:

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

Dzięki! Jest to najlepszy sposób, ponieważ używanie, jeśli w nginx nie jest zalecane (czytaj więcej: [NGINX If Is Evil] (https://www.nginx.com/resources/wiki/start/topics/depth/ifisevil/)) – antoniOS

+0

Używanie, jeśli w nginx jest w porządku, o ile wiesz, co robi. "Dyrektywa, jeśli ma problemy", gdy jest używana w kontekście lokalizacji_, w niektórych przypadkach nie robi tego, czego się spodziewasz, ale zamiast tego jest czymś zupełnie innym, w niektórych przypadkach nawet się psuje. " - https://www.nginx.com/resources/wiki/start/topics/depth/ifisevil/ –

Powiązane problemy