НейроАгент

Ошибка 404 при сортировке товаров с умным фильтром в Bitrix

Решение проблемы 404 ошибки при сортировке товаров в корневой папке каталога с умным фильтром в Bitrix. Конфликт правил URL и настройка компонента.

Вопрос

Почему при использовании фильтра в корневой папке каталога возникает ошибка 404 при сортировке товаров? Я реализовал фильтр в файле sections.php комплексного компонента catalog с следующим кодом:

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 при сортировке товаров в корневой папке каталога с умным фильтром возникает из-за конфликта правил обработки адресов и неправильной конфигурации компонента. Основная проблема заключается в том, что правило для фильтра перехватывает все запросы, включая те, которые предназначены для сортировки, и не позволяет им правильно обработаться.

Содержание

Основные причины проблемы

Ошибка 404 при сортировке товаров возникает по нескольким основным причинам:

  1. Конфликт правил обработки адресов - ваше правило для фильтра перехватывает запросы к сортировке
  2. Некорректная настройка компонента - параметры SET_STATUS_404 и SEF_MODE работают неправильно
  3. Проблемы работы в корневом каталоге - умный фильтр требует специальной настройки для работы без указания раздела

Согласно исследованиям, наиболее частой причиной является конфликт правил в файле urlrewrite.php, где правило для фильтра имеет слишком широкий шаблон и мешает обработке других запросов [источник 3].

Конфликт правил URL Rewrite

Ваше правило:

'CONDITION' => '#^/catalog/filter/([a-z0-9_\-\/]+)/apply/#'

Эта проблема возникает потому, что ваше правило для фильтра слишком общее и перехватывает все запросы, начинающиеся с /catalog/filter/, включая те, которые содержат параметры сортировки.

Проблема: Когда пользователь нажимает на сортировку, браузер отправляет запрос вида:

/catalog/filter/parameters/?sort=name&order=asc

Ваше правило перехватывает этот запрос и направляет его в /catalog/index.php, но параметры сортировки теряются.

Решение: Нужно изменить правило, чтобы оно не перехватывал запросы с дополнительными параметрами:

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, который критически важен для корректной работы фильтра.

php
"SET_STATUS_404" => "N"

Согласно документации, важно поставить “SET_STATUS_404” => “N”, чтобы не отлавливать 404 при повторной фильтрации [источник 7]. Если этот параметр не указан или установлен в “Y”, система будет генерировать ошибку 404 при всех дополнительных запросах, включая сортировку.

Для более сложной проверки можно использовать следующий код в result_modifier.php компонента:

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) имеет свои особенности:

  1. Путь к фильтру: При работе в корне нужно правильно настраивать параметр SMART_FILTER_PATH
  2. Структура URL: URL должен строго соответствовать шаблону с `/apply/ в конце
  3. Компонент каталога: Нужно использовать правильный комплексный компонент

Для работы в корневом каталоге рекомендуется использовать следующий подход:

php
$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

Измените правило для фильтра, чтобы оно не конфликтовало с сортировкой:

php
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,
),

Добавьте отдельное правило для сортировки:

php
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. Настройка компонента

Добавьте обязательные параметры в вызов компонента:

php
$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 ошибок:

apache
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>

Практическая настройка

Для корректной работы умного фильтра в корневом каталоге с сортировкой выполните следующие шаги:

  1. Настройте правила URL Rewrite:

    • Правило для фильтра должно заканчиваться на /apply/?$
    • Добавьте отдельное правило для дополнительных параметров
    • Правильно распределите приоритеты (SORT)
  2. Настройте компонент:

    • Установите SET_STATUS_404 => "N"
    • Укажите правильные параметры для работы в корне
    • Настройте SEF правила
  3. Проверьте комплексный компонент:

    • Убедитесь, что в catalog/index.php правильно обрабатываются все параметры
    • Проверьте передачу параметров сортировки
  4. Тестируйте работу:

    • Проверьте сортировку без фильтра
    • Проверьте сортировку с активным фильтром
    • Убедитесь, что URL корректно формируются

Заключение

Основная причина ошибки 404 при сортировке товаров в корневом каталоге с умным фиистром - это конфликт правил обработки адресов и некорректная настройка параметров компонента.

Ключевые моменты для решения проблемы:

  1. Измените правило URL Rewrite, чтобы оно не перехватывало запросы с параметрами сортировки
  2. Установите SET_STATUS_404 => "N" в параметрах компонента
  3. Правильно настройте параметры для работы в корневом каталоге
  4. Убедитесь, что комплексный компонент корректно обрабатывает все параметры

При правильной настройке умный фильтр должен работать корректно как в разделах каталога, так и в его корне, без возникновения ошибок 404 при сортировке товаров.

Источники

  1. Как подружить catalog.smart.filter и 404? — Форум 1С-Битрикс
  2. Как настроить 404 для страниц фильтра, если параметра переданного фильтру не существует? — Хабр Q&A
  3. Почему страница результатов фильтра в каталоге 404? — Хабр Q&A
  4. Как победить ошибку 404 при фильтрации в корне каталога? — Хабр Q&A
  5. Показывать 404 ошибку при неправильных значениях в URL адресе для фильтра — lexa.pro
  6. Умный фильтр (bitrix:catalog.smart.filter) - поддержка работы в корне каталога (без указания раздела)
  7. bitrix Если smart.filter в корне выдает 404 для 2х и более ч/ — ftask.ru
  8. 404 ошибка Kombox: Умный фильтр с ЧПУ
  9. bitrix вывести в корень каталога smart.filter — ftask.ru
  10. Configuring The Error 404 and SEF URL’s — Bitrix24 Training
  11. 1C-Bitrix - How to set 404 page filter if the parameter passed to the filter is not there? — Helperbyte