[英]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.