Можно ли отклонить все запросы nginx, которые не отправляют с ними базовые данные аутентификации?
У меня есть такие запросы:
xxx.xxx.xxx.xxx - - [24/Oct/2012:10:32:12 +0200] "POST /path HTTP/1.1" 401 1387 "-" "Apache-HttpClient/4.1.1 (java 1.5)" "-"
xxx.xxx.xxx.xxx - paul [24/Oct/2012:10:32:12 +0200] "POST /path HTTP/1.1" 200 192 "-" "Apache-HttpClient/4.1.1 (java 1.5)" "-"
и я хочу отклонить первый, который не предоставляется пользователю. Как вы можете видеть, он уже отправляет HTTP-код 401, но этот код создается не напрямую из nginx, а из базового сервера приложений. Я хочу прямо отрицать это в nginx. Есть ли способ проверить, предоставлен ли пользователь?
И возможно ли это без настройки обычной базовой аутентификации непосредственно в nginx?
Nginx хранит имя пользователя, полученное в результате аутентификации, в $remote_user
. Вы должны иметь возможность проверить, не пусто ли оно, и соответственно выполнить желаемое действие (например, вернуть ошибку 401). Что-то вроде:
if ($remote_user = ''){
return 401;
}
Судя по всему, вы уже заполняете $remote_user
переменная (поскольку она отображается в ваших журналах) - насколько я знаю, вы должны использовать Nginx Базовый модуль HTTP Auth для заполнения этой переменной.
Обычная проверка подлинности устанавливает заголовок авторизации. В Nginx заголовки HTTP-запросов доступны через $http_HEADER
, так что в этом случае $http_authorization
. Если вы реализуете базовую аутентификацию вне Nginx и задаете этот заголовок, вы можете проверить, не является ли заголовок пустым. (В качестве альтернативы, в зависимости от того, как вы реализуете аутентификацию, вы можете установить собственный заголовок, который вы тестируете).