Отклонить запрос Nginx без аутентификации вообще
Можно ли отклонить все запросы 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?
1 ответ
Nginx хранит имя пользователя, полученное в результате аутентификации, в $remote_user
, Вы должны быть в состоянии проверить, что он не пустой, и, соответственно, выполнить желаемое действие (например, вернуть ошибку 401). Что-то вроде:
if ($remote_user = ''){
return 401;
}
Судя по всему, вы уже заполняете $remote_user
переменная (поскольку она отображается в ваших журналах) - насколько я знаю, вы должны использовать HTTP-модуль базового аутентификации Nginx для заполнения этой переменной.
Обычная аутентификация устанавливает заголовок авторизации. В Nginx заголовки HTTP-запроса доступны через $http_HEADER
так что в этом случае $http_authorization
, Если вы реализуете базовую аутентификацию вне Nginx и устанавливаете этот заголовок, вы можете проверить, что заголовок не пустой. (В качестве альтернативы, в зависимости от того, как вы реализуете аутентификацию, вы можете установить настраиваемый заголовок, который вы тестируете).