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

Ссылка на товар ведёт в 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'

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

Причины

  1. У товара пустой символьный код примерно 35% случаев

    ПризнакАдрес товара содержит идентификатор или обрывается на разделе, ссылка ведёт в 404.

    ПроверкаСмотрим поле CODE у элемента выборкой выше: у сбойных товаров оно пустое.

    Что делатьВключаем автогенерацию символьного кода в настройках инфоблока и пересохраняем элементы; при выгрузке из 1С код приходит из источника, и его заполняют там.

  2. Правила обработки адресов не совпадают с настройками компонента примерно 25% случаев

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

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

    Что делатьПриводим шаблоны к одному виду и пересохраняем страницу каталога: правило переписывается при сохранении.

  3. Товар не привязан к разделу примерно 20% случаев

    ПризнакТовар открывается по прямому адресу, но из списка раздела ссылка ведёт в 404.

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

    Что делатьПривязываем элемент к разделу; при выгрузке из 1С проверяем, что группы номенклатуры сопоставлены разделам инфоблока.

  4. Символьный код повторяется у двух товаров примерно 12% случаев

    ПризнакОдин товар открывается, второй с тем же кодом отдаёт 404 или чужую карточку.

    ПроверкаГруппируем элементы инфоблока по коду и ищем группы больше одной записи.

    Что делатьВключаем проверку уникальности кода в настройках инфоблока и разводим дубли вручную.

  5. Страница детального просмотра не создана примерно 8% случаев

    Признак404 отдаёт веб-сервер, а не платформа: страницы с оформлением сайта нет вовсе.

    ПроверкаПроверяем наличие файла детальной страницы в папке каталога на диске.

    Что делатьСоздаём страницу мастером комплексного компонента: он раскладывает файлы разделов и карточки сам.

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

Почему после включения ЧПУ пропали все товары?

Правила обработки адресов созданы, но шаблоны в параметрах компонента остались прежними. Компонент собирает ссылки по своим шаблонам, а обработчик разбирает адрес по правилу, и они должны совпадать.

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

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

Товар лежит в двух разделах, какой адрес будет у карточки?

Адрес собирается по первому разделу привязки. Из второго раздела ссылка ведёт туда же, и отдельной карточки у товара не появляется.

Почему 404 отдаётся только на части товаров?

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

Смежное

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