【问题标题】:Complex nginx rewrite rules for subdomains子域的复杂 nginx 重写规则
【发布时间】:2011-01-16 08:50:05
【问题描述】:

我目前在我的 nginx.conf 中有以下(hacky)重写规则,以允许将动态子域重定向到一个 Django 实例。

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/*

【问题讨论】:

    标签: nginx subdomain mod-rewrite url-rewriting


    【解决方案1】:

    您可以使用正则表达式服务器名称(请参阅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;
      }
    }
    

    【讨论】:

    • 谢谢!这是最好的方法,因为不推荐在 nginx 中使用 if(阅读更多:NGINX If Is Evil
    • 在 nginx 中使用 if 没问题,只要你了解它的作用。 “指令 if 有问题在位置上下文中使用时,在某些情况下,它不会做你期望的事情,而是完全不同的事情。在某些情况下,它甚至会出现段错误。” - nginx.com/resources/wiki/start/topics/depth/ifisevil
    【解决方案2】:

    其实我觉得改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\regex 脚本更好的话,可能会更简单:)

    【讨论】:

    • 您好@Frozenskys 我有一个问题here。我不确定如何配置我的代理服务器。如果可能,请提供您的意见。
    【解决方案3】:

    也许更好的办法是配置 django 来处理子域,而不是在你的网络服务器中添加重写。我是这样做的:http://sharjeel.2scomplement.com/2008/07/24/django-subdomains/

    【讨论】:

    • 您好@sharjeel 我有一个问题here。我不知道如何配置我的代理服务器。如果可能,请提供您的意见
    猜你喜欢
    • 1970-01-01
    • 2015-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-20
    相关资源
    最近更新 更多