Поддомены

Igor Sysoev is at rambler-co.ru
Mon Aug 31 18:45:11 MSD 2009


On Mon, Aug 31, 2009 at 06:28:41PM +0400, Роман wrote:

> я уже ее решил путем такой махинации

Именно махинации. Не удивляйтесь, если при переезде на новую версию
махинация перестанет работать. Вам уже несколько раз предложили описать
то, что нужно, словами (а также желательно с применением точек и запятых),
с тем, чтобы показать правильную конфигурацию.

> location / {
> 	root	/home/user/host.ru$subdomain;
> 
> 	try_files $uri @backend;
> }
> 
> location @backend {
> 	root	/home/user/host.ru$subdomain;
> 
> 	if ($subdomain_name = "subdomain") {
> 		rewrite ^ /engine/index.php last;
> 	}
> 
> 	fastcgi_pass	unix:/var/run/php-fpm/user.sock;
> 	fastcgi_index	index.php;
> 	fastcgi_param	SCRIPT_FILENAME  $document_root$fastcgi_script_name;
> 	include	fastcgi_params;
> }
> 
> теперь в @backend я могу дазавать различные реврайты для любого поддомена
> 
> 
> 31 августа 2009 г. 17:55 пользователь Sergey Shepelev
> (temotor at gmail.com) написал:
> > 2009/8/31 Роман <n.g.i.n.x.e.r at gmail.com>:
> >> нет только на 1 домен
> >> а по другому я не знаю как запрограммировать веб интерфейс для работы юзеров
> >> так что даже если и чуток медленнее, выбирать не приходится
> >>
> >
> > Последний раз, опишите задачу. Мне надоело, что вы игнорируете самую
> > важную просьбу.
> >
> >> 31 августа 2009 г. 15:20 пользователь Sergey Shepelev
> >> (temotor at gmail.com) написал:
> >>> 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 }
> >>>>>>>> }
> >>>>>>>>
> >>>>>>>
> >>>>>>
> >>>>>
> >>>>
> >>>
> >>
> >

-- 
Игорь Сысоев
http://sysoev.ru





More information about the nginx-ru mailing list