Welcome! Log In Create A New Profile

Advanced

Re: не все локешены получают зачение из регулярки сервера

Maxim Dounin
September 10, 2009 04:04AM
Hello!

On Wed, Sep 09, 2009 at 07:35:31PM +0400, Peter Leonov wrote:

> On 09.09.2009, at 17:15, Maxim Dounin wrote:
>
>> Hello!
>>
>> On Wed, Sep 09, 2009 at 04:40:46PM +0400, Peter Leonov wrote:
>>
>>> При таком конфиге
>>>
>>> server
>>> {
>>> …
>>> server_name ~^([A-Za-z\-\.]+)\.retailstars\.ru$;
>>>
>>> set $city $1;
>>> location /db { root /www/life/new.retailstars.ru/$city; }
>>> location /index { root /www/life/new.retailstars.ru/$city; }
>>> location /form { root /www/life/new.retailstars.ru/$city; }
>>> …
>>> }
>>>
>>> Переменная $city определена только в /index, для остальных локейшенов
>>> это пустая строка.
>>> Отказ от временной переменной $city и использование $1 не помогает.
>>
>> Если при обработки запроса случяется матчинг любого регулярного
>> выражения (e.g. location заданный регулярным выражением),
> Понимаю это.
> Регуляркой задан только сервер (я регулярки, вообще, не очень-то люблю).
>
>> а потом
>> - внутренний редирект,
> Точно! Есть включения через SSI.
> Локейшен /index срабатывает напряму, а остальные инклюдятся в его реквест
> через SSI-фильтр. Наверняка, не хватает пары строчечек в конструкторе
> реквестов. Или регулярки в SSI конфликтуют с регулярками из конфига.

Да, если в SSI используются регулярные выражения - то это тоже
изменит $1.

>
>> то конструкция
>>
>> server_name ~^(...);
>> set $blah $1;
>>
>> работать не будет. Ибо матчинга server_name заново не случится, а
>> set $blah $1 - произойдёт и использует $1 из результатов последнего
>> регулярного выражения.
> То есть set — это такое же императивное зло, как и if/rewrite? ;)

Нет, тут проблема именно в $1. При том что он ставится в одной
фазе обработки запроса, а используется - в другой.

Возможные решения достаточно очевидны - либо сделать server_name
со встроенным set, либо повторять его для редиректов/подзапросов
перед фазой серверных rewrite.

Хотя мне в данном случае вполне разумным решением кажется

set $name "default";
if ($http_host ~* ...) {
set $name $1;
}

Директивы модуля rewrite на уровне server{} вполне безопасны и
побочных последствий не несут.

Maxim Dounin

>
>>
>> Коротко резюмируя - если в конфиге есть "...", то так делать
>> нельзя.
> Да, многоточия меня тоже смутили бы.
>
> Пока откачусь на конфиг с копипастом.
> Спасибо за подсказку, Максим. Попробую ночерком разобраться по дебаг-логу
> :)
>
>>
>> Maxim Dounin
>>
>> p.s. Please do not hijack unrelated threads.
>>
>
> С уважением,
> Петр Леонов.
> +7 (905) 758-12-73
>
Subject Author Posted

worker'ы падают

Alexander Kochetov September 08, 2009 03:32PM

не все локешены получают зачение из регулярки сервера

Peter Leonov September 09, 2009 08:54AM

Re: не все локешены получают зачение из регулярки сервера

Maxim Dounin September 09, 2009 09:30AM

Re: не все локешены получают зачение из регулярки сервера

Peter Leonov September 09, 2009 11:48AM

Re: не все локешены получают зачение из регулярки сервера

Maxim Dounin September 10, 2009 04:04AM

Re: worker'ы падают

Maxim Dounin September 09, 2009 09:52AM

Re: worker'ы падают

Alexander Kochetov September 09, 2009 10:26AM

Re: worker'ы падают

Maxim Dounin September 10, 2009 04:16AM

Re: worker'ы падают

Alexander Kochetov September 10, 2009 04:46AM



Sorry, only registered users may post in this forum.

Click here to login

Online Users

Guests: 157
Record Number of Users: 8 on April 13, 2023
Record Number of Guests: 421 on December 02, 2018
Powered by nginx      Powered by FreeBSD      PHP Powered      Powered by MariaDB      ipv6 ready