Доступы и безопасность

Ссылка на сайт уходила в чат без картинки — из-за одной строки в robots.txt

Разметка Open Graph на месте, страница открывается, у других превью есть. Разборщик Telegram не отдаёт приоритет более длинному Allow — и за картинкой не идёт.

Александр Цапков10 сентября 20262 мин

Отправляешь ссылку на свой сайт в 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 не думаете вовсе.

Отсюда правило шире одного случая: всё, что участвует в показе ссылки снаружи — картинка превью, шрифт, стиль, — должно лежать на путях без единого запрета. Не потому что запрет неверен, а потому что читать его будет клиент, чьё поведение вы не контролируете и не увидите в своих логах.


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

Клиентский портал документации с паролем на входИз выбранных документов собирается портал для заказчика на адресе проекта.

Читайте также

Автор

Александр ЦапковОснователь Скоупворк

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