Рейтинг:0

Директива location не действует, если она содержит переменную.

флаг no

Что я хочу

Для меня /админ местоположение, внести в белый список несколько доверенных IP-адресов и заблокировать всех остальных.

Что у меня есть

http {
    карта $remote_addr $admin_block_path {
        по умолчанию "/admin";
        1.1.1.1 "/не-админ";
        8.8.8.8 "/не-админ";
    }

    # ¦

    сервер {
        add_header X-Test-Admin "$admin_block_path";
        расположение $admin_block_path {
            вернуть 403;
        }
    }

}

Идея состоит в том, чтобы использовать карта условно определить путь для блокировки с IP-адреса посетителя. Сохраните его в переменной и используйте эту переменную в место расположения. Если запрос поступает с ненадежного IP, переменная будет содержать /админ, и поэтому местоположение будет заблокировано /админ.

В чем проблема

место расположения не блокирует доступ к /админ.

  • я могу подтвердить с использованием add_header что переменная установлена ​​на основе IP-адреса правильно. При посещении с недоверенного IP-адреса я получаю /админи соответственно /не администратор при посещении с доверенного IP.
  • Если я заменю расположение $admin_block_path с жестко запрограммированным расположение/админ, запрос блокируется
  • Пробовал играть с двойными кавычками, безрезультатно
  • Пробовал выносить косую черту за пределы переменной, безрезультатно

Запись

К сожалению, я не могу просто хардкодить позволять/Отрицать в некоторые /админ location, потому что это перезапишет конфигурацию прохода PHP, которую я имею в другом месте в config. Из-за этого мне нужно иметь специальный /админ location, только если я знаю, что все равно отклоню запрос, и PHP не понадобится.

Версия Nginx: 1.20.1

Рейтинг:3
флаг gr

Все локации в конфиге nginx компилируются при запуске. Вы не можете использовать переменные для место расположения параметр директивы (а также вы не можете использовать переменные внутри шаблонов регулярных выражений или с некоторыми другими директивами). Более того, когда в документации директивы nginx прямо не указано, что вы можете использовать переменные для параметра какой-либо директивы, обычно это означает, что вы не можете. Вы должны использовать другую технику, чтобы достичь того, чего вы хотите. Одним из решений может быть следующее:

карта $remote_addr $admin_block_path {
    1.1.1.1 "";
    8.8.8.8 "";
    по умолчанию 1;
}

сервер {
    если ($admin_block_path) {
        переписать ^/admin/blocked;
    }
    местоположение = / заблокирован {
        внутренний;
        вернуть 403;
    }
    ...
}

Местоположение с точным соответствием имеет больший приоритет, чем регулярное выражение, поэтому оно не должно нарушать конфигурацию обработчика PHP. Сделав это местоположение внутренним, вы можете быть уверены, что оно не будет доступно напрямую (только через правило перезаписи).

mehov avatar
флаг no
Спасибо за помощь, этот подход сработал

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.