2010-02-12 108 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