Re: Поддомены
Alexey V. Karagodov
kav at karagodov.name
Mon Aug 31 15:41:21 MSD 2009
в моей практике было почти тоже самое,
только без указание server_name
т.е. всё, что явно не указано, попадало в
этот server {}
а дальше root /srv/www/$host;
а в /srv/www куча symlink-ов
On 31.08.2009, at 15:20, Sergey Shepelev wrote:
> 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