Кто-то отправляет кучу мусорных данных на порт 80 на моем сервере Apache, вызывая 400 ошибок Bad Request. К сожалению, я ничего не могу с этим поделать, но могу ли я хотя бы предотвратить заполнение моих журналов? Я не могу найти способ фильтрации на основе кода состояния в If, SetEnvIf или mod_rewrite.
В вашем случае вы хотите условное ведение журнала на основе ответа на запрос. Большинство условных журналов, например по IP-адресу или URL-адресу, работает с запросом.
До httpd 2.4 можно было сделать что-то вроде следующего, чтобы не регистрировать определенные запросы на основе данных в запросе.
например.
SetEnvIf Request_URI "^/wpad.dat(.*)$" noise
SetEnvIf Request_URI "^/favicon.ico$" noise
CustomLog access_log combined env=!noise
Однако использование SetEnvIf полезно только для фильтрации на основе запросов. Нам понадобится переменная среды (в параметре httpd Apache), которая дает нам код ответа, поскольку CustomLog обрабатывается в конце запроса.
В httpd 2.4 у нас также есть более гибкая конструкция выражения, поэтому CustomLog может иметь либо env = xxx, либо expr = xxx.
Из http://httpd.apache.org/docs/current/mod/mod_log_config.html
«Третий аргумент является необязательным и определяет, нужно ли регистрировать конкретный запрос. Условием может быть наличие или отсутствие (в случае предложения 'env =! Name') определенной переменной в серверной среде».
Итак, ваш вопрос действительно сводится к следующему: «есть ли переменная среды httpd, которая дает мне код ответа, сгенерированный для запроса»
Видеть: Список переменных среды Apache? и: https://httpd.apache.org/docs/2.4/expr.html#vars
Из самой документации:
# Conditional logging
CustomLog logs/access-errors.log common "expr=%{REQUEST_STATUS} >= 400"
CustomLog logs/access-errors-specific.log common "expr=%{REQUEST_STATUS} -in {'405','410'}"
LogLevel позволит вам установить серьезность проблем, которые вы занесли в журнал ошибок. CustomLog позволит вам редактировать, какой контент отображается в журнале доступа.
Видеть https://httpd.apache.org/docs/1.3/logs.html#errorlog и ссылки в нем, чтобы найти решение вашей конкретной проблемы, поскольку неясно, о каком журнале вы говорите в настоящее время
Условное ведение журнала Бывают случаи, когда удобно исключить определенные записи из журналов доступа на основе характеристик клиентского запроса. Это легко сделать с помощью переменных окружения. Во-первых, необходимо установить переменную среды, чтобы указать, что запрос соответствует определенным условиям. Обычно это выполняется с помощью SetEnvIf. Затем предложение env = директивы CustomLog используется для включения или исключения запросов, в которых установлена переменная среды. Некоторые примеры:
# Mark requests from the loop-back interface:
SetEnvIf Remote_Addr "127\.0\.0\.1" dontlog
# Mark requests for the robots.txt file:
SetEnvIf Request_URI "^/robots\.txt$" dontlog
# Log what remains:
CustomLog logs/access_log common env=!dontlog
В качестве другого примера рассмотрим запись запросов от англоговорящих в один файл журнала и от не говорящих на английском языке в другой файл журнала.
SetEnvIf Accept-Language "en" english
CustomLog logs/english_log common env=english
CustomLog logs/non_english_log common env=!english
Хотя мы только что показали, что условное ведение журнала является очень мощным и гибким средством, это не единственный способ контролировать содержимое журналов. Файлы журнала более полезны, когда они содержат полную запись активности сервера. Часто бывает проще просто обработать файлы журнала пост-обработкой, чтобы удалить запросы, которые вы не хотите рассматривать.
Попробуйте временно добавить в свой iptables правило для отбрасывания любых запросов, поступающих с этого IP-адреса. Может быть, это какой-то детишек из сценария играет. Но настоятельно рекомендую использовать брандмауэры для предотвращения таких вещей, прежде чем они достигнут вашего веб-сервера, например, ufw или системы обнаружения вторжений, такие как snort.