
У меня есть экземпляр 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, независимо от местоположения, куда они отправлены.