ПРОЕКТЫ 


  АРХИВ 


Apache-Talk @lexa.ru 

Inet-Admins @info.east.ru 

Filmscanners @halftone.co.uk 

Security-alerts @yandex-team.ru 

nginx-ru @sysoev.ru 


  СТАТЬИ 


  ПЕРСОНАЛЬНОЕ 


  ПРОГРАММЫ 



ПИШИТЕ
ПИСЬМА












     АРХИВ :: nginx-ru
Nginx-ru mailing list archive (nginx-ru@sysoev.ru)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Поддомены



в моей практике было почти тоже самое, только без указание 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@xxxxxxxxx>:
у меняполитика на 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@xxxxxxxxx) написал:
2009/8/31 Роман <n.g.i.n.x.e.r@xxxxxxxxx>:
ничего не понял

мне для каждого поддомена нужно задать свой реврайт
к чему ваша конструкция


Моя конструкция автоматически задаёт свой 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@xxxxxxxxx) написал:
Извините, предыдущее письмо по ошибке отправил.

2009/8/31 Sergey Shepelev <temotor@xxxxxxxxx>:
2009/8/31 Роман <n.g.i.n.x.e.r@xxxxxxxxx>:
Гдето здесь видел описание работы автоматических поддоменов
реализовал у себя подобное
но столкнулся с пробелмой - в поддомене нужно сделать реврайт правила

сечас работает такая схема

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 }
}








 




Copyright © Lexa Software, 1996-2009.