Логика обработки опций в location

Anton Kiryushkin swood at fotofor.biz
Wed Mar 18 15:27:30 UTC 2015


Здравствуйте.

Есть следующая структура

server {

location = /a.php {
  try_files @allow @allow;
}
location = /b.php
  try_files @allow @allow;
}
location @allow {
  some_checks;
  proxy_pass https://127.0.0.1:8080;
}

И вроде бы работает.

Но я хочу сделать фильтр для доступа к a.php и к b.php.
И делать это в рамках a.php и b.php.
Для этого я делаю две map, примерно следующего содержания:

map $remote_addr_a $loc_a {
  default 0;
  1.1.1.1 1;
}
map $remote_addr_b $loc_b {
  default 0;
  2.2.2.2 1;
}
map $remote_addr $all {
 default 0;
 3.3.3.3 1;
}

Что я тут хочу. Чтобы адрес 1.1.1.1 имел доступ только k a.php, 2.2.2.2 к
b.php. А по переменной $all куда угодно.

Дальше я добавляю в location a следующие вещи:
location a {
  set $remote_addr_a $remote_addr;
  set $grant 0;

 if ($loc_a) {
   set $grant 1;
 }
if ($all) {
  set $grant 1;
 }
if ($grant = 0) {
  error_page 404 = @deny;
}
try_files @allow @allow;
}

Тут происходит следующее. Переменные у меня заполняются предсказуемо. Но
только в том случае, если до try_files встречается один if. Если два, то
возвращается 404 и a.php ищется на диске, то есть не происходит
перенаправления в @allow.
То есть, вот так оно работает:

location a {
  set $remote_addr_a $remote_addr;

 if ($loc_a = 0) {
  error_page 404 = @deny;
}
try_files @allow @allow;
}

Собственно, хочется понять, почему так происходит и как сделать то, что мне
хочется.


-- 
Best regards,
Anton Kiryushkin
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.nginx.org/pipermail/nginx-ru/attachments/20150318/c265238c/attachment.html>


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