Nginx — как вернуть 404, если присутствуют заголовки аутентификации?

Nginx — как вернуть 404, если присутствуют заголовки аутентификации?

У меня есть экземпляр nginx в Интернете, который проксирует приложение. Я хотел бы возвращать 404 на любой запрос из Интернета, который пытается аутентифицироваться в приложении, поскольку все его публичные части разрешают анонимный доступ. Только пользователи в локальной сети должны иметь возможность аутентифицироваться в нем.

Я полагаю, что могу использовать простой блок if, поскольку я просто использую return 404, но я не уверен, какое условие if является наиболее надежным для обнаружения наличия заголовков аутентификации:

if (auth headers exist) {
  return 404;
}

Есть ли у кого-нибудь предложения, что можно поместить в блок if, чтобы проверить это?

решение1

В общем, если заявления не рекомендуются, или вы должны, по крайней мере, знать о некоторых побочных эффектах. Читать«Если есть зло» в блоге nginxУзнать больше.

Отвечая на ваш вопрос: если предположить, что заголовок, который вы хотите проверить, называется «Авторизация», то ваше первоначальное предположение уже было очень точным.

if ($authorization) {
    return 404;
}

Это должно уже сработать. Кроме того, если вы хотите применить это только для публичного серверного блока, вы можете использоватьngx_http_access_module

решение2

Вы можете проверить наличие заголовка Authorization в запросе, который обычно используется для аутентификации запросов. Вы можете сделать это, используя переменную $http_authorization в блоке if:

if ($http_authorization) {
  return 404;
}

В качестве альтернативы вы можете проверить наличие определенных заголовков аутентификации, которые использует ваше приложение. Например, если ваше приложение использует X-Auth-Token в качестве заголовка аутентификации, вы можете проверить его следующим образом:

if ($http_x_auth_token) {
  return 404;
}

Помните, что блок if будет оцениваться только в том случае, если запрос сделан в место, защищенное директивой auth_basic. Если вы хотите проверить наличие заголовков аутентификации во всех запросах, вы можете использовать вместо этого директиву map:

map $http_authorization $block_public_auth {
  default 0;
  "~" 1;
}

server {
  ...

  location / {
    if ($block_public_auth) {
      return 404;
    }

    ...
  }
}

Вышеуказанный вариант заблокирует все запросы с заголовком Authorization, независимо от местоположения, куда они отправлены.

Связанный контент