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