Re: Не срабатывает realip в блоке if

Maxim Dounin mdounin на mdounin.ru
Пн Июн 19 12:15:10 UTC 2017


Hello!

On Sun, Jun 18, 2017 at 07:31:05AM +0300, Иван wrote:

> Здравствуйте!
> 
> В конструкции
> 
> location /login/
> 	set_real_ip_from proxy_IP;
> 	if ($block_agent) {
> 		return 403;
>     }
> }
> 
> Всё, что попадает в блок if ($block_agent == 1), в логи пишется с $remote_addr 
> проксирующего сервера (proxy_IP), то есть set_real_ip_from не отрабатывает. 
> set_real_ip_from поместить в блок include nginx не дает. Пока что решил 
> проблему меняя формат логов для в блоке if, но что это, баг\фича? И можно ли 
> исправить?

Это фича.  Если директива set_real_ip_from задана на уровне 
location, то замена адреса происходит после выбора конфигурации, в 
котором будет обрабатываться запрос, перед работой модулей контроля 
доступа.  А в конфигурации выше - ошибка возвращается с помощью 
директив модуля rewrite, на этапе "выбора конфигурации по 
условию" (см. http://nginx.org/ru/docs/http/ngx_http_rewrite_module.html). 
В результате ошибка 403 случается до того, как адрес клиента 
заменён модулем realip, и в логи попадает исходный ip.

Чтобы подобных сюрпризов не было - правильнее всего задать 
set_real_ip_from на уровне server, тогда замена ip-адреса клиента 
будет происходить сразу после чтения запроса.

-- 
Maxim Dounin
http://nginx.org/


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