Вопрос или проблема
Есть ли способ различать обычные 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 с учетом современных стандартов заголовков, вы сможете оптимизировать работу вашего сервера и улучшить обработку запросов в зависимости от их типа.