Подтвердить что ты не робот

Nginx: запрос отклонения, если заголовок отсутствует или неверен

Если у меня есть заголовки: X_HEADER1 и X_HEADER2, я хочу отклонить все запросы, если ни один из этих заголовков не установлен или не содержит правильных значений. Каков наилучший способ сделать это?

Спасибо

4b9b3361

Ответ 1

Вы можете использовать два оператора IF перед или в блоке местоположения для проверки заголовков, а затем вернуть код ошибки 403, если он присутствует. В качестве альтернативы вы можете использовать эти операторы IF для перезаписи в конкретный блок местоположения и запретить все в этом месте:

if ($http_x_custom_header) {
    return 403;
}

Справка:
https://www.nginx.com/resources/wiki/start/topics/depth/ifisevil/
https://nginx.org/en/docs/http/ngx_http_access_module.html

Добавление более подробной информации в комментарий/запрос:

if ($http_x_custom_header) {
    return 405;
}

, это означает, что существует заголовок

если вы хотите проверить, существуют ли правильные значения, сначала вам нужно сопоставить правильные значения с переменной.

map $http_x_header $is_ok {
    default "0";
    Value1  "1";
    Value2  "1";
    Value3  "1";
}

if ($is_ok) {
    return 405; 
}

, это сначала отображает значение заголовка в том, хорошо ли оно или нет, а затем проверяет, поддерживается ли переменная.

EDIT: Удалена точка с запятой после блока карты, так как это вызывает ошибку.

Ответ 2

Если вы хотите разрешить HTTP-запросы только на основе некоторых допустимых значений заголовка, которые помещены в заголовок ответа, одним из возможных способов является использование инструмента OpenResty для применения таких ограничений.

В следующем примере разрешается доступ только к запросам со значениями "name1" или "name2" для header1:

    header_filter_by_lua '
    local val = ngx.header["header1"]
    if val then
            if (val ~= "name1") and (val ~= "name2") then
                return ngx.exit(400)
            end
    end
    ';

Ответ 3

Я много исследовал, чтобы решить простую проблему: разрешить proxy_pass, только если в заголовке запроса есть определенный токен. Я попробовал все ответы здесь, и ничего не получилось так, как мне понравилось. Мое окончательное решение:

location /api {
    proxy_http_version 1.1;

    if ($http_authorization != "Bearer 1234") {
        return 401;
    }

    proxy_pass http://app:3000/;
}

Ссылки:

NGINX не равно

nginx - читать пользовательский заголовок с вышестоящего сервера

https://serverfault.com/info/490760/nginx-location-exact-match-matches-beyond-arguement

https://www.nginx.com/resources/wiki/start/topics/depth/ifisevil/