簡體   English   中英

子域的復雜nginx重寫規則

[英]Complex nginx rewrite rules for subdomains

我目前在我的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/*

您可以使用正則表達式服務器名稱(請參閱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重寫規則比為django編寫中間件要容易得多。 在了解了nginx如何處理它的位置匹配(最精確 - >最不精確)后,我為/ media和/ download創建了位置以及為/ I捕獲所有位置然后將重寫規則移到/位置下並簡化了它 - 因為我不再擔心檢查文件,因為整個位置傳遞給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腳本更好:)可能會更簡單:)

也許更好的想法是配置django來處理子域而不是在你的web服務器中添加重寫。 我是這樣做的: http//sharjeel.2scomplement.com/2008/07/24/django-subdomains/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM