Re: Поддомены

Роман n.g.i.n.x.e.r at gmail.com
Mon Aug 31 18:28:41 MSD 2009


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


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


More information about the nginx-ru mailing list