nginx-ru Digest, Vol 47, Issue 4

Maxim Dounin mdounin at mdounin.ru
Mon Sep 2 10:29:59 UTC 2013


Hello!

On Mon, Sep 02, 2013 at 11:38:22AM +0300, Андрей Середенко wrote:

> В таком случае, если отрабатывает только последний из if'ов - то в данной
> конфигурации:
> 
>  location ~* /test/url/Page.asmx {

[...]

>             set $my_ipsrc 0;
>             # allow 10.10.1.75/32;
>             if ($remote_addr = 10.10.1.75) { set $my_ipsrc 1; }
>             # allow 10.20.1.20/32;
>             if ($remote_addr = 10.20.1.20) { set $my_ipsrc 1; }
>             # allow 10.20.1.21/32;
>             if ($remote_addr = 10.20.1.21) { set $my_ipsrc 1; }
>             # allow 10.100.1.0/24;
>             if ($remote_addr = 10.100.1.0/24) { set $my_ipsrc 1; }

JFYI: эта проверка никогда не срабатывает, т.к. операция "=" - это 
сравнение со строкой, а адрес не может выглядеть как 
"10.100.1.0/24".

>             # allow 178.111.122.133/32;
>             if ($remote_addr = 178.111.122.133) { set $my_ipsrc 1; }
>             # deny all;
>             if ($my_ipsrc = 0) { return 500; }
>        }
> 
> всем, кроме последнего адреса, должно возвращаться "500" ?
> или лыжи не едут? :)

Вы неправильно прочитали то, что было написано.  Запрос будет 
обрабатываться в контексте неявного location'а, относящегося к 
последнему сработавшему if'у.  E.g., для ip 10.10.1.75 запрос 
будет обротан в контексте

    if ($remote_addr = 10.10.1.75) { set $my_ipsrc 1; }

со всеми вытекающими из этого последствиями вроде отсутствия 
try_files.

Но вообще конфигурация, скажем так, далека от разумного.  
Правильно - использовать allow/deny (+ error_page, если нужно 
вместо 403 выдать 500) или geo{}.

Ссылки по теме:

http://nginx.org/ru/docs/http/ngx_http_access_module.html
http://nginx.org/ru/docs/http/ngx_http_geo_module.html

-- 
Maxim Dounin
http://nginx.org/en/donation.html



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