Почему при использовании фильтра в корневой папке каталога возникает ошибка 404 при сортировке товаров? Я реализовал фильтр в файле sections.php комплексного компонента catalog с следующим кодом:
$APPLICATION->IncludeComponent( "bitrix:catalog.smart.filter", "", array( "IBLOCK_TYPE" => $arParams["IBLOCK_TYPE"], "IBLOCK_ID" => $arParams["IBLOCK_ID"], "SECTION_ID" => 0, "FILTER_NAME" => $arParams["FILTER_NAME"], "PRICE_CODE" => $arParams["~PRICE_CODE"], "CACHE_TYPE" => $arParams["CACHE_TYPE"], "CACHE_TIME" => $arParams["CACHE_TIME"], "CACHE_GROUPS" => $arParams["CACHE_GROUPS"], "SAVE_IN_SESSION" => "N", "FILTER_VIEW_MODE" => $arParams["FILTER_VIEW_MODE"], "SECTION_TITLE" => "NAME", "SECTION_DESCRIPTION" => "DESCRIPTION", 'HIDE_NOT_AVAILABLE' => $arParams["HIDE_NOT_AVAILABLE"], "TEMPLATE_THEME" => $arParams["TEMPLATE_THEME"], 'CONVERT_CURRENCY' => $arParams['CONVERT_CURRENCY'], 'CURRENCY_ID' => $arParams['CURRENCY_ID'], "SEF_MODE" => $arParams['SEF_MODE'], "SEF_RULE" => "/catalog/filter/#SMART_FILTER_PATH#/apply/", "SMART_FILTER_PATH" => $_REQUEST["SMART_FILTER_PATH"], "PAGER_PARAMS_NAME" => $arParams["PAGER_PARAMS_NAME"], "INSTANT_RELOAD" => $arParams["INSTANT_RELOAD"], "SHOW_ALL_WO_SECTION" => "Y" ), $component, array('HIDE_ICONS' => 'Y') );?>В правилах обработки адресов я задал правило:
18 =>
array (
‘CONDITION’ => ‘#^/catalog/filter/([a-z0-9_-/]+)/apply/#’,
‘RULE’ => ‘SMART_FILTER_PATH=$1&’,
‘ID’ => ‘’,
‘PATH’ => ‘/catalog/index.php’,
‘SORT’ => 90,
),
Проблема в том, что при попытке сортировки товаров возникает ошибка 404. Если отключить вывод страницы 404, то при просмотре компонента отображается содержимое section.php. Если отключить ЧПУ для фильтра, то всё работает корректно. В чём может быть причина?
Ошибка 404 при сортировке товаров в корневой папке каталога с умным фильтром возникает из-за конфликта правил обработки адресов и неправильной конфигурации компонента. Основная проблема заключается в том, что правило для фильтра перехватывает все запросы, включая те, которые предназначены для сортировки, и не позволяет им правильно обработаться.
Содержание
- Основные причины проблемы
- Конфликт правил URL Rewrite
- Настройка SET_STATUS_404
- Проблемы работы в корневом каталоге
- Решения для исправления ошибки
- Практическая настройка
- Заключение
Основные причины проблемы
Ошибка 404 при сортировке товаров возникает по нескольким основным причинам:
- Конфликт правил обработки адресов - ваше правило для фильтра перехватывает запросы к сортировке
- Некорректная настройка компонента - параметры SET_STATUS_404 и SEF_MODE работают неправильно
- Проблемы работы в корневом каталоге - умный фильтр требует специальной настройки для работы без указания раздела
Согласно исследованиям, наиболее частой причиной является конфликт правил в файле urlrewrite.php, где правило для фильтра имеет слишком широкий шаблон и мешает обработке других запросов [источник 3].
Конфликт правил URL Rewrite
Ваше правило:
'CONDITION' => '#^/catalog/filter/([a-z0-9_\-\/]+)/apply/#'
Эта проблема возникает потому, что ваше правило для фильтра слишком общее и перехватывает все запросы, начинающиеся с /catalog/filter/, включая те, которые содержат параметры сортировки.
Проблема: Когда пользователь нажимает на сортировку, браузер отправляет запрос вида:
/catalog/filter/parameters/?sort=name&order=asc
Ваше правило перехватывает этот запрос и направляет его в /catalog/index.php, но параметры сортировки теряются.
Решение: Нужно изменить правило, чтобы оно не перехватывал запросы с дополнительными параметрами:
18 => array (
'CONDITION' => '#^/catalog/filter/([a-z0-9_\-]+)/apply/?$#',
'RULE' => 'SMART_FILTER_PATH=$1&',
'ID' => '',
'PATH' => '/catalog/index.php',
'SORT' => 90,
),
Также убедитесь, что правило для фильтра имеет более низкий приоритет (большее значение SORT), чем правило для сортировки [источник 10].
Настройка SET_STATUS_404
В вашем коде не указан параметр SET_STATUS_404, который критически важен для корректной работы фильтра.
"SET_STATUS_404" => "N"
Согласно документации, важно поставить “SET_STATUS_404” => “N”, чтобы не отлавливать 404 при повторной фильтрации [источник 7]. Если этот параметр не указан или установлен в “Y”, система будет генерировать ошибку 404 при всех дополнительных запросах, включая сортировку.
Для более сложной проверки можно использовать следующий код в result_modifier.php компонента:
$URL = $APPLICATION->GetCurDir();
if ($URL != $arResult["SEF_SET_FILTER_URL"]) {
CHTTP::SetStatus("404 Not Found");
define("ERROR_404", "Y");
}
Этот код проверяет соответствие текущего URL правильному URL для фильтра [источник 2, 11].
Проблемы работы в корневом каталоге
Работа умного фильтра в корневом каталоге (без указания SECTION_ID) имеет свои особенности:
- Путь к фильтру: При работе в корне нужно правильно настраивать параметр
SMART_FILTER_PATH - Структура URL: URL должен строго соответствовать шаблону с `/apply/ в конце
- Компонент каталога: Нужно использовать правильный комплексный компонент
Для работы в корневом каталоге рекомендуется использовать следующий подход:
$APPLICATION->IncludeComponent(
"bitrix:catalog.smart.filter",
"",
array(
// ... ваши параметры ...
"SECTION_ID" => 0,
"SECTION_CODE" => "",
"SEF_RULE" => "/catalog/filter/#SMART_FILTER_PATH#/apply/",
"SMART_FILTER_PATH" => $_REQUEST["SMART_FILTER_PATH"],
"SHOW_ALL_WO_SECTION" => "Y",
"SET_STATUS_404" => "N",
// ...
)
);
Как указано в источниках, проверьте для начала комплексную компоненту, место где роутер формируется. Скорее всего проблема с путями SEF [источник 9].
Решения для исправления ошибки
1. Корректировка правил URL Rewrite
Измените правило для фильтра, чтобы оно не конфликтовало с сортировкой:
18 => array (
'CONDITION' => '#^/catalog/filter/([a-z0-9_\-]+)/apply/?$#',
'RULE' => 'SMART_FILTER_PATH=$1&',
'ID' => 'bitrix:catalog.smart.filter',
'PATH' => '/catalog/index.php',
'SORT' => 100,
),
Добавьте отдельное правило для сортировки:
19 => array (
'CONDITION' => '#^/catalog/filter/([a-z0-9_\-]+)/apply/(.*)$#',
'RULE' => 'SMART_FILTER_PATH=$1&$2',
'ID' => 'bitrix:catalog.sort',
'PATH' => '/catalog/index.php',
'SORT' => 90,
),
2. Настройка компонента
Добавьте обязательные параметры в вызов компонента:
$APPLICATION->IncludeComponent(
"bitrix:catalog.smart.filter",
"",
array(
// ... ваши параметры ...
"SET_STATUS_404" => "N",
"SEF_MODE" => "Y",
"SEF_RULE" => "/catalog/filter/#SMART_FILTER_PATH#/apply/",
"SMART_FILTER_PATH" => $_REQUEST["SMART_FILTER_PATH"] ?? "",
"SHOW_ALL_WO_SECTION" => "Y",
"INSTANT_RELOAD" => "Y",
// ...
)
);
3. Проверка файла .htaccess
Убедитесь, что в файле .htaccess правильно настроена обработка 404 ошибок:
ErrorDocument 404 /404.php
<IfModule mod_rewrite.c>
Options +FollowSymLinks
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !/bitrix/urlrewrite.php$
RewriteRule ^(.*)$ /bitrix/urlrewrite.php [L]
RewriteRule .* - [E=REMOTE_USER:%{HTTP:Authorization}]
</IfModule>
Практическая настройка
Для корректной работы умного фильтра в корневом каталоге с сортировкой выполните следующие шаги:
-
Настройте правила URL Rewrite:
- Правило для фильтра должно заканчиваться на
/apply/?$ - Добавьте отдельное правило для дополнительных параметров
- Правильно распределите приоритеты (SORT)
- Правило для фильтра должно заканчиваться на
-
Настройте компонент:
- Установите
SET_STATUS_404 => "N" - Укажите правильные параметры для работы в корне
- Настройте SEF правила
- Установите
-
Проверьте комплексный компонент:
- Убедитесь, что в catalog/index.php правильно обрабатываются все параметры
- Проверьте передачу параметров сортировки
-
Тестируйте работу:
- Проверьте сортировку без фильтра
- Проверьте сортировку с активным фильтром
- Убедитесь, что URL корректно формируются
Заключение
Основная причина ошибки 404 при сортировке товаров в корневом каталоге с умным фиистром - это конфликт правил обработки адресов и некорректная настройка параметров компонента.
Ключевые моменты для решения проблемы:
- Измените правило URL Rewrite, чтобы оно не перехватывало запросы с параметрами сортировки
- Установите
SET_STATUS_404 => "N"в параметрах компонента - Правильно настройте параметры для работы в корневом каталоге
- Убедитесь, что комплексный компонент корректно обрабатывает все параметры
При правильной настройке умный фильтр должен работать корректно как в разделах каталога, так и в его корне, без возникновения ошибок 404 при сортировке товаров.
Источники
- Как подружить catalog.smart.filter и 404? — Форум 1С-Битрикс
- Как настроить 404 для страниц фильтра, если параметра переданного фильтру не существует? — Хабр Q&A
- Почему страница результатов фильтра в каталоге 404? — Хабр Q&A
- Как победить ошибку 404 при фильтрации в корне каталога? — Хабр Q&A
- Показывать 404 ошибку при неправильных значениях в URL адресе для фильтра — lexa.pro
- Умный фильтр (bitrix:catalog.smart.filter) - поддержка работы в корне каталога (без указания раздела)
- bitrix Если smart.filter в корне выдает 404 для 2х и более ч/ — ftask.ru
- 404 ошибка Kombox: Умный фильтр с ЧПУ
- bitrix вывести в корень каталога smart.filter — ftask.ru
- Configuring The Error 404 and SEF URL’s — Bitrix24 Training
- 1C-Bitrix - How to set 404 page filter if the parameter passed to the filter is not there? — Helperbyte