NGINX – различие между обычными HTTP и AJAX-запросами

Вопрос или проблема

Есть ли способ различать обычные HTTP(s) и AJAX запросы?

Я думал записать заголовок X-Requested-With в логи nginx, но кажется, он не устанавливается каждым AJAX клиентом.

Как правильно настроить nginx, чтобы определить, был ли запрос AJAX запросом или нет?

Это старый вопрос, но существующий ответ неверен в 2024 году. Сейчас серверный код может отличать входящие XHR запросы от не-XHR запросов, проверяя заголовок запроса Sec-Fetch-Dest. Во всех современных браузерах значение Sec-Fetch-Dest для XHR запросов равно строке “empty”. Для не-XHR запросов это что-то другое.

  • XHR запрос: Sec-Fetch-Dest: empty
  • Вся веб-страница: Sec-Fetch-Dest: document
  • Изображение: Sec-Fetch-Dest: image
  • CSS: Sec-Fetch-Dest: style
  • JavaScript: Sec-Fetch-Dest: script

Смотрите https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Sec-Fetch-Dest

Ответ или решение

Для дифференциации между обычными HTTP(S) запросами и AJAX-запросами при использовании NGINX, необходимо учитывать несколько важных аспектов.

Изначально идея использования заголовка X-Requested-With оказалась не полностью надежной, поскольку не все AJAX-клиенты устанавливают этот заголовок. Это ограничивало возможности точного распознавания AJAX-запросов.

Однако, начиная с 2024 года, появилась возможность более точного различения входящих запросов за счет использования заголовка Sec-Fetch-Dest. Этот заголовок позволяет более надежно определить тип запроса благодаря следующим значениям:

  • Для AJAX-запросов (известных также как XHR – XMLHttpRequest) значение заголовка будет "empty".
  • Для полного веб-страницы: "document".
  • Для изображения: "image".
  • Для CSS-стилей: "style".
  • Для JavaScript: "script".

Таким образом, чтобы различать AJAX и другие типы запросов в NGINX, вы можете использовать следующий конфигурационный блок в вашем конфиге NGINX для логирования или применения специфичного поведения к различным типам запросов:

map $http_sec_fetch_dest $is_ajax {
    default 0;
    'empty' 1;
}

server {
    location / {
        if ($is_ajax) {
            # Логика для обработки AJAX-запросов
        }
        # Общая логика для всех запросов
    }
}

Таким образом, использование заголовков Sec-Fetch-Dest позволит вам более точно управлять и разделять потоки AJAX и обычных запросов к вашему серверу, что, в свою очередь, откроет дополнительные возможности для оптимизации и безопасности.

Для получения дополнительной информации о заголовке Sec-Fetch-Dest, вы можете обратиться к документу: MDN о Sec-Fetch-Dest.

В результате, правильно настроив NGINX с учетом современных стандартов заголовков, вы сможете оптимизировать работу вашего сервера и улучшить обработку запросов в зависимости от их типа.

Оцените материал
Добавить комментарий

Капча загружается...