Как на лету изменять страницы, которые отдаются ботам, делающим слишком много запросов?
Сейчас слишком активные боты и парсеры отсекаются через limit_req_zone $binary_remote_addr zone=one:10m rate=2r/s;
Хочу сделать так, чтобы страницы им отдавались, но с искаженной информацией. Допустим, замена текста в определенном блоке на другой.
Или другой путь - может ли Nginx добавить специфичный HTTP-хедер в запросы от таких ботов? Тогда я изменю выдачу на уровне веб-приложения.
Андрей, добавить отдельный именованный location location @имя { ... } с нужными fastcgi_param или sub_filter.
Потом указать этот именованный location в error_page.
Но в sub_filter нет поддержки regex. Там только поиск и замена статичных строк.
А fastcgi_param позволит передать нужные заголовки чтоб менять выдачу на уровне веб-приложения.
Спасибо, буду пробовать. Кстати, есть переменная $limit_req_status, ее можно как-то использовать? Сделать limit_req_status 200; и в зависимости от этой переменной добавлять хедер?
Андрей, там есть ещё limit_req_dry_run
Включает режим пробного запуска. В данном режиме скорость обработки запросов не ограничивается, однако в зоне разделяемой памяти текущее число избыточных запросов учитывается как обычно.
Т.е. считает запросы, но не блокирует и можно сделать проще без отдельного location и error_page.
Добавить limit_req_dry_run on;.
А там где основной location ~ \.php$ добавить fastcgi_param limit_req_status $limit_req_status;.
В переменной $_SERVER['limit_req_status'] будет приходить PASSED или REJECTED_DRY_RUN.
Или другой путь - может ли Nginx добавить специфичный HTTP-хедер в запросы от таких ботов? Тогда я изменю выдачу на уровне веб-приложения.
Конечно. Отправляйте ботов в другой локейшен, который при проксировании вовнутрь будет добавлять заголовок или вовсе - перенаправлять запросы на другой урл или порт. Директива proxy_set_header.
Андрей, Ага понял тогда нет вопросов просто вызвал небольшое недоумение такой формат системы защиты. Однако если подразумевается честная дезинформации в нужные моменты то нет никаких вопросов. Из советов только не делайте это слишком часто иначе быстро вычислят и она потеряет смысл.
С учетом того, что у вас не API сервис, а сайт, то указанного значение слишком мало. В среднем на сайте легитимный посетитель, не бот, может генерировать до 6-12 RPS.
Андрей, не страниц. Это RPS с одного легитимного IP. Если у вас этот лимит прописан в location отвечающий за связь с бэком и только с ним, то еще как-то нормально. Но если это общий лимит на server, то могут возникнуть проблемы.