Re: не срабатывает if в location

Igor Sysoev igor на sysoev.ru
Пт Май 6 22:06:07 MSD 2011


On Fri, May 06, 2011 at 06:29:52PM +0300, Dobrozhansky Sergey wrote:
> Имею следуюзий конфиг:
> 
> map $http_user_agent  $players {
> 	default	1;
> 	"~mplayer|vlc|nsplayer"	0;
> }
> 
> server {
> 	location /pl/	{
> 
> 		if ($players)	{
> 			return 444;
> 		}
> 
>                  location ~ ^/pl/([0-9]+)$	{
>                          proxy_pass http://127.0.0.1:4026/$1;
> 		}
> 
>                  location ~ ^/pl/([0-9]+)$      {
>                          proxy_pass http://127.0.0.1:4026/$1;
>                  }
> 
> 	}
> }
> 
> Если if ($players) { return 444; } расположен внутри location /pl/, то 
> он не срабатывает.
> 
> Если его вынести из location /pl/ - работает.
> Вот пример рабочего конфига:
> 
> server {
> 
> 	if ($players)	{
> 		return 444;
> 	}
> 
> 	location /pl/	{
> 
>                  location ~ ^/pl/([0-9]+)$	{
>                          proxy_pass http://127.0.0.1:4026/$1;
> 		}
> 
>                  location ~ ^/pl/([0-9]+)$      {
>                          proxy_pass http://127.0.0.1:4026/$1;
>                  }
> 
> 	}
> }
> 
> Версия nginx-1.0.1.

Потому что nginx сначала ищет location, а потом выполняет в нём "if".

Здесь
                  location ~ ^/pl/([0-9]+)$      {
                          proxy_pass http://127.0.0.1:4026/$1;
                  }

регулярное выражение не нужно:

                  location /pl/      {
                          proxy_pass http://127.0.0.1:4026/;
                  }


-- 
Igor Sysoev



Подробная информация о списке рассылки nginx-ru