Перейти к содержимому

ЧПУ комплексного компонента - настройка и разбор 404

Настраиваем человекопонятные адреса у комплексного компонента и разбираемся, почему детальная страница отдаёт 404.

Решение

Включаем режим ЧПУ и задаём шаблоны адресов:

$APPLICATION->IncludeComponent('bitrix:news', '', [
'SEF_MODE' => 'Y',
'SEF_FOLDER' => '/news/', // корневая папка компонента
'SEF_URL_TEMPLATES' => [
'news' => '', // список: /news/
'section' => '#SECTION_CODE#/', // раздел: /news/sport/
'detail' => '#SECTION_CODE#/#ELEMENT_CODE#/',
],
]);

Шаблоны считаются от корневой папки, а не от корня сайта. Пустой шаблон означает саму папку, и именно поэтому список новостей открывается по адресу папки без дополнительного пути.

Сохраняем страницу и смотрим, что попало в правила:

Окно терминала
# правило создаётся при сохранении страницы с компонентом
grep -A 4 "'/news/" /home/bitrix/www/urlrewrite.php
# правило появляется в файле само, когда компонент включён в режим ЧПУ
# CONDITION - образец адреса, PATH - файл, который его обслуживает

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

Проверяем, какое правило поймало адрес:

// временно в начале страницы: что пришло компоненту из адреса
echo '<pre>', print_r($_REQUEST, true), '</pre>';
// код элемента и раздела приходят сюда именно из правила обработки

Пустые переменные при верном на вид адресе означают, что правило не совпало. Тогда сравнивают образец в правиле и шаблон в параметрах компонента символ за символом.

Переносим компонент в другую папку:

'SEF_FOLDER' => '/blog/', // старые ссылки перестанут работать
// после смены папки страницу обязательно пересохранить: правило перепишется
// каждый лишний вариант адреса потом придётся закрывать каноническим

Перенос без правки корневой папки ломает сразу все адреса компонента. Старые ссылки при этом остаются в поиске и во внешних источниках, поэтому переезд сопровождают переадресацией со старых путей на новые.

Список правил обработки читается сверху вниз, и порядок в нём имеет значение. Более общий образец, стоящий выше, перехватывает адреса, предназначенные точному правилу ниже. Так соседние комплексные компоненты начинают спорить за одни и те же пути, и появляется классическая жалоба «детальная страница новости показывает содержимое акции»: адрес поймало чужое правило. Порядок меняют в интерфейсе правил, не трогая при этом сами страницы с компонентами.

Список и детальная страница обслуживаются одним и тем же файлом. Комплексный компонент выбирает режим по разобранному адресу, поэтому отдельных файлов под разделы и элементы в структуре сайта нет и создавать их не нужно. Попытка положить рядом свою страницу с тем же путём приводит к тому, что правило перестаёт совпадать.

Типичные проблемы

Список открывается, детальная страница даёт 404.

Шаблон детальной страницы в параметрах компонента не совпадает с образцом в правиле обработки адресов. Ссылки собираются по одному образцу, а разбираются по другому.

После правки шаблонов ничего не изменилось.

Страница с компонентом не пересохранена. Правило обработки адресов переписывается именно при сохранении страницы.

Детальная страница показывает чужой раздел.

Адрес поймало правило соседнего комплексного компонента. Правила проверяются по порядку, и более общее перехватывает запрос.

После переноса страницы сломались все ссылки.

Не изменена корневая папка компонента. Все шаблоны адресов считаются от неё, а не от корня сайта.

Адрес открывается, но параметры пустые.

Образец правила не выделяет нужные части пути. Компонент получает адрес без кода раздела и элемента.

Частые вопросы

Можно ли обойтись без правил обработки адресов?

Да, в режиме без ЧПУ: компонент передаёт параметры в адресе запроса. Адреса при этом становятся нечитаемыми, а поисковые системы хуже разбирают структуру раздела.

Как сделать адрес без раздела?

Убрать код раздела из шаблона детальной страницы. Тогда адрес собирается только из кода элемента, а раздел в него не попадает.

Почему правило исчезает после обновления?

Файл правил перезаписывается при сохранении страниц и при переустановке компонента. Свои правила добавляют через интерфейс правил, а не правкой файла.

Как проверить правило, не открывая сайт?

Сравнением образца в правиле с шаблоном в параметрах компонента. Совпадение должно быть посимвольным, включая косые черты в начале и в конце.

Смежное

Первоисточник