Ссылка на сайт уходила в чат без картинки — из-за одной строки в robots.txt
Разметка Open Graph на месте, страница открывается, у других превью есть. Разборщик Telegram не отдаёт приоритет более длинному Allow — и за картинкой не идёт.
Отправляешь ссылку на свой сайт в Telegram — а превью пустое: ни заголовка, ни картинки. Страница открывается, разметка Open Graph на месте, у других сайтов превью есть.
Причина нашлась не в разметке, а в robots.txt.
Строка, которая всё ломала
В файле стояло Disallow: /api/ и рядом более длинное Allow: /api/og — для
той самой картинки превью.
По стандарту побеждает более длинное правило, и Яндекс с Google так и
делают. Разборщик Telegram приоритет длинному Allow не отдаёт: он видит
Disallow: /api/, считает картинку запрещённой и за ней не идёт.
Файл при этом правильный. Неправильно его читает один конкретный клиент — и именно тот, в чьих чатах вы ссылку и распространяете.
Что сделали
Картинку превью перенесли на путь, который не попадает ни под один
Disallow. Правило в robots.txt не трогали: оно верное, и подгонять его
под чужой разборщик значило бы открыть роботам весь /api/ ради одного
клиента.
Второе, что выяснилось попутно
Telegram кеширует картинку превью навсегда и не перезапрашивает её ни по
max-age, ни по ETag. Мы это измерили: за два дня он девять раз перечитал
саму страницу и ни разу не сходил за изображением.
Практическое следствие: поменяли обложку — старая будет показываться, пока не сменится сам адрес файла.
Поэтому обложка у нас живёт по адресу с номером версии в имени —
/og-v4.png, — а не с ?v=2 в хвосте. Вариант с query-строкой мы пробовали
первым, и стало хуже: превью строилось с заголовком и описанием, а картинка
«начинала грузиться и пропадала», причём запроса к серверу не приходило вовсе.
Адрес изображения с query-строкой его загрузчик не принимает.
Старый файл при этом остаётся на месте: на него ссылаются уже построенные превью в чужих чатах, и удалив его, вы сломаете картинку в сообщениях, которые разошлись раньше.
Как проверить у себя
Сначала — доходит ли клиент до картинки вообще:
curl -sI https://example.com/путь-к-картинке-превью | head -3
Потом — что о ней думает robots.txt: найдите все правила, под которые
попадает этот путь, и проверьте, нет ли среди них Disallow короче, чем
ваш Allow.
Самый быстрый способ увидеть результат — отправить ссылку самому себе в
«Избранное». Если превью пустое, а curl картинку отдаёт — дело в правилах,
а не в разметке.
Что из этого следует
Стандарт описывает, как разбирать robots.txt, но соблюдают его не все, и
отклонения проявляются не в поиске, а в мессенджере — там, где вы про
robots.txt не думаете вовсе.
Отсюда правило шире одного случая: всё, что участвует в показе ссылки снаружи — картинка превью, шрифт, стиль, — должно лежать на путях без единого запрета. Не потому что запрет неверен, а потому что читать его будет клиент, чьё поведение вы не контролируете и не увидите в своих логах.
Мы отдаём заказчику витрину проекта ссылкой, и в мессенджере она обязана разворачиваться правильно с первого раза. Как устроены витрины — Клиентский портал.
Читайте также
Автор
Александр ЦапковОснователь Скоупворк
Веду платформу и её боевой контур сам: разработка, выкат, дежурство. Пишу о том, на чём мы обожглись, — с датами, замерами и ссылками на решения в репозитории.