Сложные правила перезаписи nginx для поддоменов - PullRequest
6 голосов
/ 13 февраля 2010

В настоящее время у меня есть следующее (хакерское) правило перезаписи в моем nginx.conf, чтобы разрешить перенаправление динамических поддоменов в один экземпляр 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/*.

Ответы [ 3 ]

9 голосов
/ 23 февраля 2012

Вы можете использовать имена серверов регулярных выражений (см. 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;
  }
}
8 голосов
/ 15 февраля 2010

На самом деле, я думаю, что гораздо проще изменить правила перезаписи nginx, чем писать промежуточное ПО для django, чтобы сделать это.После прочтения того, как nginx обрабатывает его сопоставление местоположений (наиболее точное -> наименее точное), я создал местоположения для / media и / download, а также перехват всех местоположений для /, а затем переместил правило перезаписи в каталог / location и упростил его.- поскольку я больше не беспокоюсь о проверке файлов, потому что все это местоположение передается в 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 были лучше :)

0 голосов
/ 14 февраля 2010

Возможно, лучшей идеей было бы настроить django для обработки поддоменов вместо добавления перезаписи в ваш веб-сервер. Вот как я это сделал: http://sharjeel.2scomplement.com/2008/07/24/django-subdomains/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...