Попробуйте поменять в функции
$filename = md5('GET|site.ru|'.$data['path']);
на
$filename = md5('GET|'.$data['host'].'|'.$data['path']);
Не видя все эти site.ru и как вы их запрашиваете, очень сложно о чём-то судить )
А вы ничего в конфиге Nginx не ковыряли?
Или, там в урлах на сайте?
Или, возможно, сам Nginx обновился и по другому теперь хэш считает.
https://www.nginx.com/blog/nginx-caching-guide/
function clearCache($value){
Надо смотреть - откуда оно вызывается и что туда передаётся.
По всей видимости, тот самый урл, который вы хотите почистить.
Ищите откуда идёт обращение к clearCache
В данном случае, $value всего лишь локальная переменная функции и искать её во всех скриптах бессмысленно.
Значит в $value пусто, либо кривое какое-то значение.
parse_url возвращает массив данных об урле.
Чтобы посмотреть, что там напарсилось, вместо echo надо print_r($data).
Если вывод в браузер, то лучше так
echo('<pre>');
print_r($data)
echo('</pre>');
Ну, или
foreach($data as $k=>$v) echo ("$k=$v<br/>");
Способ абсолютно рабочий. Многократно проверен мной же на своих серваках 🙄
Логи писать в tmpfs, дабы диск не напрягать.
Формат логов привести к минимуму (ip+uri)
В nginx - limit_req/limit_conn (кстати, по нему еще и логи загребать проще).
Чуть больше ляма запросов в минуту, ну, значит запускать скрипт каждую минуту с постротацией логов.
Поначалу, конечно, будет подтупливать. Но ботнеты не бесконечны.
После отражения атаки, надо бы ещё проверить - не попали ли случайно в ipset поисковые боты. У меня такая проверка идёт ещё до добавления, но если нет времени писать отдельную приблуду, проверяющую адрес, это можно сделать постфактум.
При совсем уж глобальном трындеце, можно стартстопить nginx и в промежутках логи разгребать.
Естественно, это всё будет работать, пока в гигабит десятку не нальют.
Но это уже другая история 😂
Пишется маленький скрипт, который разгребает логи и составляет таблицу айпишников с аномальной активностью. Ну, типа, несколько обращений к главной странице за определённый промежуток времени. Дальше, весь списов в ipset->iptables и всё. Скрипт пихаете в крон с интервалом минут в пять.
Если логи большие, то чтобы сам скрипт колом не встал, можно этим же скриптом logrotate пинать.
И почему у вас главная 403 отдаёт?
А зачем её совсем закрывать?
Сделайте в nginx http авторизацию и всё.
Ну, либо, чтобы nginx пускал туда только с определённых айпишников.
Пихать 2000 строк в htaccess - садизм по отношению к серверу и мазохизм по отношению к себе ))
Если есть таблица соответствия имён и номеров, то одна строчка в конфиге nginx и несколько строк в пхп.
Чтобы всё пулей летало даже на калькуляторе, не заморачиваться с sql, а пихнуть эту таблицу в redis. Ну, либо, если opcache стоит, то можно вообще в массив засунуть и прям в теле скрипта оставить.
Перемещаете куда-нибудь все папки с цифровыми именами.
С помощью того же пхп распихиваете всё по новым папкам.
В nginx что-нибудь, типа try_files $uri $uri/ /redirect.php?$args;
Если nginx не стоит, то в апаче что-то похожее в две строчки пишется.
С апачем уже лет 15 не работаю, поэтому х.з..
1. Клиент запрашивает site.ru/papka/1/2
2. nginx/apache смотрит - есть такая папка или нет. Если есть, отдаёт её. Если нет, отправляет запрос в redirect.php
3. redirect.php разгребает request_uri и смотрит ваши цифирки в таблице. Если есть соответствие, то 301 клиенту на новый адрес. Если нет, то 404.
Если на серваке есть ssh, то pscp от putty.
У меня так куча компов статистику сливает на один сервак.