НейроАгент

Ошибка 404 фильтра в корне каталога с ЧПУ Bitrix

Решение проблемы 404 ошибки при использовании фильтра в корне каталога с включенным ЧПУ в Bitrix. Настройка правил обработки адресов и параметров компонента.

Почему фильтр в корне папки catalog возвращает ошибку 404 при включенном ЧПУ? Я реализовал фильтр в файле sections.php комплексного компонента catalog с использованием компонента bitrix:catalog.smart.filter. При попытке сортировки товаров через фильтр возникает ошибка 404. Если отключить ЧПУ в настройках фильтра, то все работает корректно. В чем может быть причина проблемы?

Вот код реализации фильтра:

php
<?$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, вместо нее отображается содержимое файла section.php. Подскажите, как решить эту проблему с фильтром в корне каталога?

НейроАгент

Основная проблема ошибки 404 при использовании фильтра в корне папки catalog с включенным ЧПУ связана с конфликтом между правилами обработки адресов и структурой компонента. Это распространенная ситуация в Bitrix, когда фильтр пытается использовать URL, который не соответствует существующей структуре страницы.

Содержание

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

Ошибка 404 возникает из-за нескольких ключевых факторов:

  1. Конфликт маршрутизации: Ваше правило обработки адресов #^/catalog/filter/([a-z0-9_\-\/]+)/apply/# указывает на путь /catalog/index.php, но компонент находится в файле sections.php, что создает несоответствие между ожидаемым и фактическим путем.

  2. Некорректная обработка корневого раздела: При SECTION_ID = 0 и включенном ЧПУ система может неправильно интерпретировать запросы фильтра как попытку доступа к несуществующей странице.

  3. Параметр SMART_FILTER_PATH: Значение $_REQUEST["SMART_FILTER_PATH"] может быть пустым или некорректным при первой загрузке страницы, что приводит к формированию неправильного URL.

  4. Приоритет правил обработки адресов: Ваше правило с SORT = 90 может конфликтовать с другими правилами маршрутизации каталога, имеющими более высокий приоритет.

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

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

php
'CONDITION' => '#^/catalog/filter/([a-z0-9_\-\/]+)/apply/#',
'RULE' => 'SMART_FILTER_PATH=$1&SECTION_ID=0&',
'ID' => 'CATALOG_FILTER',
'PATH' => '/catalog/sections.php',
'SORT' => 100,

Ключевые изменения:

  • Увеличен приоритет (SORT = 100) для того, чтобы правило имело больший вес
  • Явно указан SECTION_ID=0 для корневого раздела
  • Изменен целевой путь на /catalog/sections.php вместо /catalog/index.php

Также убедитесь, что в файле .htaccess или настройках веб-сервера правильно настроена обработка 404 ошибок, которая должна перенаправлять на /catalog/sections.php.

Корректная настройка параметров компонента

Ваш код компонента нуждается в нескольких важной модификации:

php
<?$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" => "Y",
		"SEF_RULE" => "/catalog/filter/#SMART_FILTER_PATH#/apply/",
		"SMART_FILTER_PATH" => $arResult["VARIABLES"]["SMART_FILTER_PATH"],
		"PAGER_PARAMS_NAME" => $arParams["PAGER_PARAMS_NAME"],
		"INSTANT_RELOAD" => $arParams["INSTANT_RELOAD"],
		"SHOW_ALL_WO_SECTION" => "Y",
		"SET_TITLE" => "Y",
		"SET_BROWSER_TITLE" => "Y",
		"SET_META_DESCRIPTION" => "Y",
		"SET_META_KEYWORDS" => "Y"
	),
	$component,
	array('HIDE_ICONS' => 'Y')
);?>

Важные изменения:

  1. Замените $_REQUEST["SMART_FILTER_PATH"] на $arResult["VARIABLES"]["SMART_FILTER_PATH"] для корректного получения значения из контекста
  2. Явно установите SEF_MODE = "Y"
  3. Добавьте параметры SEO-оптимизации для лучшей работы с ЧПУ

Альтернативные решения

Вариант 1: Перемещение фильтра в отдельный раздел

Если проблема сохраняется, создайте отдельный раздел в каталоге (например, “Подбор товаров”) и поместите фильтр туда, а не в корень.

Вариант 2: Использование компонента bitrix:catalog

Вместо catalog.smart.filter используйте стандартный компонент bitrix:catalog с включенными настройками фильтрации:

php
<?$APPLICATION->IncludeComponent(
	"bitrix:catalog",
	"",
	array(
		"IBLOCK_TYPE" => $arParams["IBLOCK_TYPE"],
		"IBLOCK_ID" => $arParams["IBLOCK_ID"],
		"SECTION_ID" => 0,
		"ELEMENT_SORT_FIELD" => "sort",
		"ELEMENT_SORT_ORDER" => "asc",
		"FILTER_NAME" => "arrFilter",
		"INCLUDE_SUBSECTIONS" => "Y",
		"SHOW_ALL_WO_SECTION" => "Y",
		"HIDE_NOT_AVAILABLE" => "N",
		"TEMPLATE_THEME" => "site",
		"SEF_MODE" => "Y",
		"COMPONENT_TEMPLATE" => "smart_filter",
		// Другие параметры...
	),
	$component
);?>

Вариант 3: Настройка через URL_TEMPLATES

Добавьте в файл /urlrewrite.php следующее правило:

php
array(
    'CONDITION' => '#^/catalog/filter/([a-z0-9_\-\/]+)/apply/#',
    'RULE' => 'SMART_FILTER_PATH=$1&SECTION_ID=0&',
    'ID' => 'CATALOG_FILTER',
    'PATH' => '/catalog/sections.php',
    'SORT' => 100,
),

После этого очистите кеш правил URL и перегенерируйте их через интерфейс Bitrix.

Проверка и отладка

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

  1. Включите отображение ошибок в начале файла sections.php:

    php
    define("BX_SHOW_INCLUDE_TIME_EXEC", true);
    ini_set("display_errors", 1);
    error_reporting(E_ALL);
    
  2. Проверьте переменные:

    php
    echo "<pre>";
    print_r($_REQUEST);
    print_r($arResult["VARIABLES"]);
    echo "</pre>";
    
  3. Проверьте сгенерированные URL:
    Включите режим отладки Bitrix и посмотрите, какие URL формируются компонентом.

  4. Проверьте правила обработки адресов:
    Убедитесь, что ваше правило имеет правильный приоритет и не конфликтует с другими правилами.

  5. Проверьте файл 404.php:
    Убедитесь, что файл 404.php корректно перенаправляет на /catalog/sections.php при ошибках.

Чаще всего проблема решается правильной настройкой правил обработки адресов и использованием корректных параметров для передачи SMART_FILTER_PATH. Если проблема сохраняется, рекомендуется создать отдельный раздел для фильтрации вместо размещения его в корне каталога.