Ссылка на товар ведёт в 404 - разбор причин
Товар виден в списке раздела, но по ссылке отдаётся 404. Разбираем причины в порядке убывания частоты.
С чего начать
Смотрим, какой адрес компонент собрал для товара:
$res = CIBlockElement::GetList([], ['IBLOCK_ID' => 5, 'ID' => $elementId], false, false, ['ID', 'CODE', 'IBLOCK_SECTION_ID', 'DETAIL_PAGE_URL']);// адрес детальной страницы собирается по шаблону из настроек инфоблокаwhile ($row = $res->GetNext()) { printf("code=%-20s раздел=%-6s url=%s\n", $row['CODE'] ?: '(пусто)', $row['IBLOCK_SECTION_ID'] ?: '(нет)', $row['DETAIL_PAGE_URL']);}Три значения из этой выборки закрывают почти все случаи. Пустой символьный код означает, что адрес собрать не из чего. Отсутствие раздела означает, что товар лежит в корне и в адрес раздела не попадает. Собранный адрес сравнивают с тем, что стоит в ссылке на витрине: расхождение видно сразу.
Ищем повторяющиеся символьные коды:
// группировка по CODE: платформа сама добавляет в результат счётчик CNT$res = CIBlockElement::GetList([], ['IBLOCK_ID' => 5], ['CODE']);while ($row = $res->Fetch()) { if ($row['CNT'] > 1) { printf("код %-24s повторяется %d раз\n", $row['CODE'], $row['CNT']); }}Повторяющийся код ломает адресацию выборочно: открывается тот товар, который обработчик нашёл первым, а остальные с этим кодом отдают чужую карточку или 404.
Смотрим правило обработки адресов для каталога:
# правила лежат одним файлом в корне сайта, каталогу принадлежат строки с его путёмgrep -n "catalog" /home/bitrix/www/urlrewrite.php | head -20
# ищем страницу детального просмотра: без неё 404 отдаёт сам веб-серверls -l /home/bitrix/www/catalog/ | grep -E 'index|element|detail'Шаблон в правиле и шаблон в параметрах компонента должны совпадать до символа. Правило переписывается при сохранении страницы каталога, поэтому ручная правка файла живёт до первого сохранения из админки.
Причины
-
У товара пустой символьный код примерно 35% случаев
ПризнакАдрес товара содержит идентификатор или обрывается на разделе, ссылка ведёт в 404.
ПроверкаСмотрим поле
CODEу элемента выборкой выше: у сбойных товаров оно пустое.Что делатьВключаем автогенерацию символьного кода в настройках инфоблока и пересохраняем элементы; при выгрузке из 1С код приходит из источника, и его заполняют там.
-
Правила обработки адресов не совпадают с настройками компонента примерно 25% случаев
ПризнакСписок раздела открывается, детальная страница даёт 404 на всех товарах сразу.
ПроверкаСверяем шаблон адреса в параметрах комплексного компонента с правилом в настройках обработки адресов.
Что делатьПриводим шаблоны к одному виду и пересохраняем страницу каталога: правило переписывается при сохранении.
-
Товар не привязан к разделу примерно 20% случаев
ПризнакТовар открывается по прямому адресу, но из списка раздела ссылка ведёт в 404.
ПроверкаСмотрим поле раздела у элемента: у сбойных оно пустое, хотя в админке товар виден.
Что делатьПривязываем элемент к разделу; при выгрузке из 1С проверяем, что группы номенклатуры сопоставлены разделам инфоблока.
-
Символьный код повторяется у двух товаров примерно 12% случаев
ПризнакОдин товар открывается, второй с тем же кодом отдаёт 404 или чужую карточку.
ПроверкаГруппируем элементы инфоблока по коду и ищем группы больше одной записи.
Что делатьВключаем проверку уникальности кода в настройках инфоблока и разводим дубли вручную.
-
Страница детального просмотра не создана примерно 8% случаев
Признак404 отдаёт веб-сервер, а не платформа: страницы с оформлением сайта нет вовсе.
ПроверкаПроверяем наличие файла детальной страницы в папке каталога на диске.
Что делатьСоздаём страницу мастером комплексного компонента: он раскладывает файлы разделов и карточки сам.
Частые вопросы
Почему после включения ЧПУ пропали все товары?
Правила обработки адресов созданы, но шаблоны в параметрах компонента остались прежними. Компонент собирает ссылки по своим шаблонам, а обработчик разбирает адрес по правилу, и они должны совпадать.
Можно ли задать свой адрес товару?
Да, через символьный код элемента: он подставляется в шаблон адреса. Полностью произвольный путь, не совпадающий с шаблоном, потребует своего правила обработки.
Товар лежит в двух разделах, какой адрес будет у карточки?
Адрес собирается по первому разделу привязки. Из второго раздела ссылка ведёт туда же, и отдельной карточки у товара не появляется.
Почему 404 отдаётся только на части товаров?
У этих товаров пустой или повторяющийся символьный код. Общая настройка ЧПУ здесь ни при чём: она ломает сразу все карточки, а не выборочно.
Смежное
- Каталог товаров - оглавление подтемы
- Витрина каталога: список раздела, сортировка, фильтр - откуда берётся ссылка
- Карточка товара: вывод свойств, картинок и характеристик - что на детальной странице
- Страница 404: код ответа, свой шаблон, мягкие ошибки - код ответа для несуществующего товара
- Каталог и продажи - устройство магазина целиком
- ЧПУ комплексного компонента: настройка и разбор 404 - как устроены правила адресов
- Правка структуры разделов: перенос, слияние, удаление - смена адресов после переноса раздела
- Товар в нескольких разделах: привязки, адрес, дубли в списках - какой раздел даёт адрес товару
- Символьный код элемента и раздела: генерация, уникальность - как проставить коды всему каталогу разом