Карта сайта, которая врала про даты, и как её починить
lastmod, зашитый константой в код, — это обещание роботу, что сайт не меняется. Как брать дату из файла, что считать полом и почему точность в сутки правильнее миллисекунд.
В карте сайта у всех адресов стояла одна дата, и она была написана рукой в константе. Сайт при этом менялся почти каждый день. Для робота это заявление: возвращаться незачем.
Почему так вышло
Константа появилась из здравого рассуждения: если подставить в lastmod текущее время, карта будет утверждать, что сайт изменился прямо сейчас, при каждом обходе. Это тоже ложь, и её поисковики распознают — дата, которая всегда «сегодня», перестаёт считаться сигналом.
Поэтому дату зафиксировали и оставили комментарий «обновлять при изменениях». Через две недели она устарела, потому что такие комментарии не работают: обновлять её никто не помнит, и напоминать некому.
Где правильный источник
У даты изменения страницы есть честный источник — файл, в котором лежат её слова. Панель пишет этот файл, значит время изменения файла и есть ответ. Правка в админке двигает дату сама, без участия человека.
Для страниц, которые живут в коде, а не в панели, такого файла нет. Их честная дата — момент выкладки: релиз создаёт новый каталог, и время его создания это и есть.
1export async function changedAt(...files: string[]): Promise<Date | undefined> {
2 const times = await Promise.all(files.map(when));
3 const known = times.filter((time): time is number => time !== undefined);
4 return known.length ? new Date(Math.max(...known)) : undefined;
5}
6
7async function when(file: string): Promise<number | undefined> {
8 try {
9 return (await stat(file)).mtimeMs;
10 } catch {
11 // Нет файла, нет прав, это каталог — всё это значит одно:
12 // сказать о дате изменения нечего.
13 return undefined;
14 }
15}
| Способ | Что сообщает роботу | Проблема |
|---|---|---|
| Константа в коде | сайт не менялся с даты X | устаревает молча |
| new Date() при запросе | менялся прямо сейчас | всегда «сегодня», сигнал обесценивается |
| Время изменения файла | менялся тогда, когда менялся | требует, чтобы контент лежал в файлах |
| Отсутствие lastmod | не знаю | робот решает сам |
Точность — сутки
Первая версия починки отдавала полный ISO с миллисекундами. Формально допустимо, но выглядело как машинный шум и утверждало, что все страницы изменились в одну и ту же миллисекунду — что было правдой, потому что все они получили дату релиза, но читалось как ошибка.
Стандарт карты сайта начинает описание поля с формата ГГГГ-ММ-ДД. Точность мельче суток для расписания обхода не значит ничего.
Чего в этой схеме всё ещё не хватает
Карта сайта — пассивный сигнал: робот придёт и прочитает её, когда сам решит. Активный способ сообщить о новой странице — протокол IndexNow: один запрос уведомляет Яндекс и Bing сразу. Его в моей схеме пока нет, и это следующая доработка.
