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

Maxim Dounin mdounin at mdounin.ru
Thu Sep 10 11:56:40 MSD 2009


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
>





More information about the nginx-ru mailing list