Техническое SEO редко про слова на странице - оно про адреса и ответы сервера. Карточка товара в магазине камер служит троим: покупателю в браузере, роботу и коду, что обходит сайт по ссылкам. Задача одна: у каждой ценной сущности - один стабильный индексируемый URL, а дубликаты не соперничают за место в выдаче.
Наивный взгляд убедителен: опубликуй страницы, поставь ссылки, поисковик разберётся сам. Он справляется, но карточка одной камеры почти всегда доступна по десятку адресов - с параметром сортировки, с меткой кампании, по http и https, со слэшем и без, внутри фильтра каталога и в языковой версии. Для человека это одна страница, для машины - разные URL с одинаковым содержимым.
Здесь модель ломается. Робот тратит ограниченный бюджет обхода на клоны вместо новых товаров. Сигналы - ссылки, поведение, авторитет - размазываются по копиям, и ни одна не набирает веса. В индекс попадает случайный вариант: адрес с трек-меткой или отфильтрованный каталог вместо чистого URL. Пользователь видит кривой адрес, магазин - просевшие позиции.
Лечение просто по идее, но требовательно к дисциплине: URL - идентичность сущности, ответ сервера - контракт с роботом. Обязанности делят несколько инструментов, путать их опасно. robots.txt управляет обходом - какие пути роботу запрашивать. sitemap.xml - подсказка к обнаружению: список канонических адресов. canonical указывает, какую из похожих страниц считать основной. meta robots со значением noindex управляет индексацией: разрешает обход, запрещает показ. Коды состояния HTTP сообщают, что случилось с адресом.
Ключ ко всему - различать обход и индексацию: тут и ломается интуиция. Кажется логичным закрыть служебную или дублирующую страницу в robots.txt, чтобы убрать из поиска. Но запрет блокирует только запрос, а не появление в индексе: при внешних ссылках поисковик покажет адрес без описания, по одному URL. Хуже того, раз скачивать запрещено, noindex на странице робот не увидит - и убрать её из индекса нечем. Правило: чтобы страница не индексировалась, обход разрешают, а показ запрещают через noindex.
Коды состояния - вторая половина контракта. Постоянный переезд на новый адрес - 301 или 308: старый вес переходит к новому URL. Временное перемещение - 302 или 307. Снятый с продажи товар отвечает 404 или 410, сообщая, что страницы нет, и освобождая бюджет обхода. Дубликат, всё же нужный пользователю - версия для печати, - остаётся доступным, но с canonical на основную версию.
| Ситуация | HTTP / механизм |
|---|---|
| Постоянно переехало | 301 или 308 |
| Временно переехало | 302 или 307 |
| Удалено навсегда | 404 или 410 |
| Дубликат доступен пользователю | canonical к основной версии |
| Страница не должна индексироваться | noindex, обход при этом не блокировать |
Отдельный вопрос - как страница доходит до робота. Критичное содержимое, ссылки, title, canonical и структурированные данные безопаснее отдавать в исходном HTML с сервера. Рендеринг на клиенте (CSR) тоже индексируется - поисковик исполняет JavaScript, - но добавляет точки отказа и откладывает смысл страницы: робот ждёт скриптов, выполняет их и лишь потом видит содержимое. Каждый лишний шаг - шанс, что canonical не проставится, а карточка уйдёт в индекс полупустой.
Стоит ли платить за это сложностью? Да, когда сущностей много и они живут в каталоге с фильтрами, сортировками и языками: дубликаты плодятся сами, и без канонизации выдача превращается в кашу. Классический провал: карточку закрыли в robots.txt как дубликат, внешняя ссылка всё равно завела её в индекс, noindex робот не прочитал - и в поиске висит голый адрес без описания, а настоящая страница конкурирует сама с собой. Дисциплина адресов дешевле разбора этого задним числом.
# robots.txt - управляет обходом, а не индексацией
User-agent: *
Disallow: /cart
Disallow: /*?sort=
Sitemap: https://example.com/sitemap.xml<link rel="canonical"
href="https://example.com/products/camera" />
<meta name="robots" content="index,follow" />