не все локешены получают зачение из регулярки сервера
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