@DRNG Можете смело менять. Добавление флага B — это прямое решение проблемы, описанной в ваших логах (AH10411).
Добавление флага [B] — это правильное и необходимое решение для устранения ошибки AH10411, которая появилась после обновления Apache.
В чем причина ошибки?
Ошибка AH10411: Rewritten query string contains control characters or spaces возникает из-за изменений в системе безопасности Apache, начиная с версии 2.4.56 (март 2023 года) .
Суть проблемы: Теперь Apache блокирует (возвращает ошибку 403) внутренние переадресации (rewrites), в результате которых в строку запроса (_route_ в вашем случае) попадают пробелы или управляющие символы . Раньше это считалось допустимым, но теперь воспринимается как потенциальная угроза безопасности (CVE-2023-25690) .
Что происходит в вашем случае: В ссылке вида .../shkaf-kupe-ekspress-s-3-zerkalami-sonoma-serebryanyj-profil-1800h600h2200.html нет пробела. Проблема возникает из-за символа перевода строки или другого управляющего символа, который появляется в логах.
Почему флаг [B] решает проблему?
Флаг [B] (escape backreferences) предписывает Apache принудительно кодировать специальные символы (включая пробелы и управляющие символы) в URL-совместимый формат (%20 для пробела) до того, как они будут подставлены в строку запроса (index.php?_route_=$1) .
Таким образом, еще до того, как Apache проверит строку запроса на наличие "опасных" символов, они будут преобразованы в безопасный вид, и ошибка не возникнет.
Как правильно заменить?
Просто добавьте B к существующему списку флагов. Ваша новая строка будет выглядеть так:
RewriteRule ^([^?]*) index.php?_route_=$1 [B,L,QSA]
Именно такая замена (добавление B) рекомендуется в официальных источниках и на форумах поддержки как основной способ решения проблемы AH10411 .
Дополнительные рекомендации (если простого [B] окажется недостаточно)
В некоторых случаях флаг [B] может кодировать слишком много символов (например, & в строке запроса), что может повлиять на работу вашего приложения (например, сломается разбор $_GET) .
Если после замены вы заметили, что перестали работать какие-то параметры в URL, можно использовать более тонкую настройку, доступную в Apache 2.4.26 и новее: ограничить список символов для кодирования .
Например, чтобы кодировать только пробел и знак вопроса (оставляя остальные символы как есть), можно заменить правило на:
# Обратите внимание на кавычки вокруг флагов
RewriteRule ^([^?]*) index.php?_route_=$1 "[B= ?,L,QSA]"
Это может помочь сохранить работоспособность сложных URL .
Краткое резюме, почему это безопасно:
Ошибка известная: Проблема возникла после обновления безопасности Apache и массово проявляется на многих хостингах.
Решение официальное: Флаг B заставляет Apache экранировать "опасные" символы (вроде невидимого символа из вашего лога), превращая их в безопасный вид. Без этого флага Apache считает такие символы угрозой и блокирует запрос.
Для вашего правила это штатная работа: Вы передаете URL в параметр _route_. Флаг B просто приводит этот URL к стандартному безопасному виду. Никакой магии или поломки функционала не произойдет.
Просто замените [L,QSA] на [L,QSA,B] (или [B,L,QSA] — порядок флагов не важен) и ошибка уйдет.
С вероятностью 99% этого будет достаточно для вашего сайта.
Источник www
Отпишитесь если поможет, ниже)