Re: Поддомены

Sergey Shepelev temotor at gmail.com
Mon Aug 31 15:20:28 MSD 2009


2009/8/31 Роман <n.g.i.n.x.e.r at gmail.com>:
> у меняполитика на 1 домен (сайт) 1 сервер
> внутри него всеи описывается
> поэтому вариант с кучей server {} не подходит

Вы дали обет использовать единственную директиву server{} на весь
конфиг nginx? Странные надуманные ограничения. Вы связываете себе руки
и ничего не получаете взамен.

>
> свой рут я же тоже задаю с помощью root    /home/user/host.ru$subdomain;
> я поэтому и написал что скрипт находящийся в
> /home/user/host.ru$subdomain видит пипку /home/user/host.ru$subdomain
> как корневую
> и кроме как по домену в конфиге nginx нельзя опереться чтобы написать
> свое rewrite правило для конкретного поддомена
>
> что то типо
>
> if ($subdomain_name = "subdomain" ) {
>        if (!-f $request_filename) {
>                rewrite ^ /engine/index.php last;
>        }
> }
>

Еще раз, писать if (!-f $request_filename) нельзя. Вместо этого надо писать

try_files $uri @php;
location @php { proxy_pass/fastcgi_pass ... }

Еще раз, опишите задачу. Не то, как вы представляете её решение, а задачу.
Вариант с проксированием на пхп на куче поддоменов в одном server{} я
вам описал в первый раз.

Чтобы реализовать вышеописанное if subdomain, if !-f *для одного
поддомена*, нужно сделать вот что:

server {
  listen ...
  server_name subdomain.domain.tld;
  root /var/www/$server_name;

  location / {
    try_files $uri @php;
  }

  location @php {
    fastcgi_pass/proxy_pass ...
  }
}

Этот конфиг:
1) работает только для одного субдомена: subdomain.domain.tld
2) раздаёт файлы из /var/www/subdomain.domain.tld
3) запросы, для которых файлы не найденны, отдаёт бекенду (у вас это
PHP) в конфигурации fastcgi_pass или proxy_pass

Можно немножко изменить для произвольных субдоменов:

server {
  listen ...
  server_name ~ (.*)\.domain\.tld;
  root /var/www/domain/$1;

  location / {
    try_files $uri @php;
  }

  location @php {
    fastcgi_pass/proxy_pass ...
  }
}

Этот конфиг:
1) работает для всех субдоменов: *.domain.tld, но не для домена domain.tld.
2) раздаёт файлы из /var/www/domain/subdomain
3) запросы, для которых файлы не найденны, отдаёт бекенду (у вас это
PHP) в конфигурации fastcgi_pass или proxy_pass

>
> 31 августа 2009 г. 12:43 пользователь Sergey Shepelev
> (temotor at gmail.com) написал:
>> 2009/8/31 Роман <n.g.i.n.x.e.r at gmail.com>:
>>> ничего не понял
>>>
>>> мне для каждого поддомена нужно задать свой реврайт
>>> к чему ваша конструкция
>>>
>>
>> Моя конструкция автоматически задаёт свой root для любого поддомена.
>>
>> Чтобы для каждого поддомена задавать свой реврайт, опишите каждый
>> поддомен в отдельной секции server.
>>
>> server {
>>  listen ..
>>  server_name sub1.host.ru;
>>  rewrite ^ http://foo.bar/;
>> }
>>
>> server {
>>  listen ..
>>  server_name sub2.host.ru;
>>  rewrite ^ http://zar.bar/;
>> }
>>
>> Или я не понял чего вы хотите. Объясните задачу без терминов nginx. На
>> входе есть то-то, на выходе надо иметь то-то.
>>
>>> может я чего то не понял
>>> объясните подробнее пожалуйста
>>>
>>>
>>> 31 августа 2009 г. 3:39 пользователь Sergey Shepelev
>>> (temotor at gmail.com) написал:
>>>> Извините, предыдущее письмо по ошибке отправил.
>>>>
>>>> 2009/8/31 Sergey Shepelev <temotor at gmail.com>:
>>>>> 2009/8/31 Роман <n.g.i.n.x.e.r at gmail.com>:
>>>>>> Гдето здесь видел описание работы автоматических поддоменов
>>>>>> реализовал у себя подобное
>>>>>> но столкнулся с пробелмой - в поддомене нужно сделать реврайт правила
>>>>>>
>>>>>> сечас работает такая схема
>>>>>>
>>>>>> server {
>>>>>>        listen          127.0.0.1:80;
>>>>>>        server_name     host.ru *.host.ru;
>>>>>>
>>>>>>
>>>>>>        set $subdomain "";
>>>>>>        if ($host ~* ^([a-z0-9-\.]+)\.host.ru$) {set $subdomain "/sub_$1";}
>>>>>>        if ($host ~* ^www.host.ru$)             {set $subdomain "";}
>>>>>> ...
>>>>>>        location / {
>>>>>>                root    /home/user/host.ru$subdomain;
>>>>>>        }
>>>>>> ...
>>>>>> }
>>>>>>
>>>>>> при такой схеме все что находится в поддомене понимает что находится в
>>>>>> location /
>>>>>> и привязаться не к чему как к хосту
>>>>>> но как тогда написать правило if (!-f $request_filename) { ... } ?
>>>>>>
>>>>>
>>>>> Нельзя писать if (-f $request_filename).
>>>>>
>>>>>> или может есть другой вариант?
>>>>>>
>>>>>
>>>>> server {
>>>>>  listen ..
>>>>>  server_name www.hosting.ru;
>>>>>  ...
>>>>> }
>>>>>
>>>>> server {
>>>>>  listen..
>>>>>  server_name ~ ^(.*)\.hosting\.ru;
>>>>
>>>> Самое главное ж:
>>>>
>>>>  root /home/user/hosting.ru/$1;
>>>>
>>>>>
>>>>>  location / {
>>>>>    try_files $uri @backend;
>>>>>  }
>>>>>
>>>>>  location @backend { здесь проксирование на ваш PHP }
>>>>> }
>>>>>
>>>>
>>>
>>
>


More information about the nginx-ru mailing list