2010-02-12 120 views
6

目前,我有以下(哈克)重寫我的nginx.conf規則,允許動態子域名被重新定向到一個Django的實例。複雜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; 
} 

我敢肯定有一個更有效的方式做到這一點,但我需要改變這個規則,以便於*.domain.com/media/**.domain.com/downloads/*任何要求去domain.com/media/*domain.com/downloads/*

回答

8

其實我認爲改變nginx重寫規則比爲django編寫中間件要容易得多。在讀完了nginx進程的位置匹配(最準確 - >最不精確)後,我創建了/ media和/ download的位置,並捕獲了/的所有位置,然後將重寫規則移至/位置並簡化了它 - 因爲我不再擔心,因爲這整個位置傳遞給Django的的文件檢查 - 規則變爲:

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

,並很可能會更簡單,如果我的nginx的\正則表達式的腳本是更好:)

+0

你好@Frozenskys我有一個問題[這裏](http://stackoverflow.com/questions/18744741/setting-up-nginx-reverse-proxy-for-s3 -hosted-websites)。我不確定如何配置我的代理服務器。如果可能的話,請提供您的輸入。 – KillABug 2013-09-13 06:16:18

0

也許一個更好的主意是配置的Django來處理子域,而不是在你的網絡服務器增加一個重寫的。下面是我做的:http://sharjeel.2scomplement.com/2008/07/24/django-subdomains/

+0

你好@sharjeel我有一個問題[這裏](http://stackoverflow.com/questions/18744741/setting-up-nginx-reverse-proxy-for-s3-hosted-websites)。我不確定如何配置我的代理服務器。如果可能請給你的輸入 – KillABug 2013-09-13 06:20:19

9

您可以使用正則表達式服務器名稱(請參見http://nginx.org/en/docs/http/server_names.html#regex_names)並直接將匹配組分配給變量$ subdomain:

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

謝謝!這是最好的方法,因爲如果在nginx中使用不推薦(閱讀更多:[NGINX If If Is Evil](https://www.nginx.com/resources/wiki/start/topics/depth/ifisevil/)) – antoniOS 2016-09-18 14:41:21

+0

使用if在nginx中,只要你理解它的作用就沒有問題。 「指令如果在位置上下文中使用時有問題,在某些情況下,它不會達到您的期望值,而是完全不同的東西,在某些情況下甚至會出現段錯誤。」 - https://www.nginx.com/resources/wiki/start/topics/depth/ifisevil/ – 2016-09-26 16:52:10