ЧПУ комплексного компонента - настройка и разбор 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.
Шаблон детальной страницы в параметрах компонента не совпадает с образцом в правиле обработки адресов. Ссылки собираются по одному образцу, а разбираются по другому.
После правки шаблонов ничего не изменилось.
Страница с компонентом не пересохранена. Правило обработки адресов переписывается именно при сохранении страницы.
Детальная страница показывает чужой раздел.
Адрес поймало правило соседнего комплексного компонента. Правила проверяются по порядку, и более общее перехватывает запрос.
После переноса страницы сломались все ссылки.
Не изменена корневая папка компонента. Все шаблоны адресов считаются от неё, а не от корня сайта.
Адрес открывается, но параметры пустые.
Образец правила не выделяет нужные части пути. Компонент получает адрес без кода раздела и элемента.
Частые вопросы
Можно ли обойтись без правил обработки адресов?
Да, в режиме без ЧПУ: компонент передаёт параметры в адресе запроса. Адреса при этом становятся нечитаемыми, а поисковые системы хуже разбирают структуру раздела.
Как сделать адрес без раздела?
Убрать код раздела из шаблона детальной страницы. Тогда адрес собирается только из кода элемента, а раздел в него не попадает.
Почему правило исчезает после обновления?
Файл правил перезаписывается при сохранении страниц и при переустановке компонента. Свои правила добавляют через интерфейс правил, а не правкой файла.
Как проверить правило, не открывая сайт?
Сравнением образца в правиле с шаблоном в параметрах компонента. Совпадение должно быть посимвольным, включая косые черты в начале и в конце.
Смежное
- ЧПУ комплексного компонента - оглавление подтемы
- Свои ЧПУ-адреса: правила обработки, порядок, конфликты - правила для своих страниц
- Ссылка на товар ведёт в 404 - тот же разбор для каталога
- Страница 404: код ответа, свой шаблон, мягкие ошибки - как правильно отдавать саму ошибку
- Карта сайта и robots.txt: генерация, расписание, мультисайт - те же шаблоны адресов в карте сайта
- Компоненты 2.0 - устройство компонентов целиком
- Разделы инфоблока - откуда берутся пути разделов
- Заголовки и метатеги каталога: шаблоны для разделов и товаров - что показывается на тех же адресах
- Шаблон сайта на практике: стили, скрипты, области - обвязка вокруг компонентов
- Дубли страниц каталога: канонический адрес, пагинация, фильтр - что делать с лишними адресами
- Комплексный компонент изнутри: маршруты, переменные, выбор страницы - как компонент разбирает адрес внутри
- Символьный код элемента и раздела: генерация, уникальность - откуда берётся код в адресе страницы