← Все статьи
2026-11-08 08:02 · 🤖 AI World

24 года браузер молча скачивал данные — и никто не замечал

Simon Willison случайно открыл сетевую панель Firefox и увидел странное: его инструмент Datasette заставлял браузер скачивать следующую страницу таблицы без единого клика пользователя. Поведению Firefox, которое это провоцировало, — 24 года.

24 года браузер молча скачивал данные — и никто не замечал

Simon Willison — один из создателей Django и автор open-source инструмента Datasette — открыл DevTools Firefox и заметил аномалию: каждый раз при открытии страницы таблицы браузер автоматически загружал следующую страницу пагинации. Никакого клика не требовалось. Виновник — стандартный HTTP-заголовок link: <url>; rel="next", который Datasette отдаёт для навигации. Firefox расценивал его как команду к prefetch.

Контекст

Datasette — открытый инструмент для публикации SQLite-баз данных через браузер. Используется в дата-журналистике, аналитике, а в последние годы — как лёгкий бэкенд для локальных AI-пайплайнов: проверить датасет перед обучением, дать модели доступ к структурированным данным, построить простой RAG поверх реальных таблиц. Willison — один из самых читаемых авторов о практике LLM: его блог ведётся с 2002 года и охватывает всё от Django до инструментов работы с большими языковыми моделями.

HTTP-заголовок Link: rel="next" — официальный стандарт для подсказки поисковикам о пагинации. Технически правильный паттерн. Но Firefox интерпретирует его агрессивнее других браузеров: он не просто записывает информацию, а тут же делает prefetch — загружает следующую страницу в фоне, пока пользователь ещё смотрит на текущую.

Willison раскопал Bugzilla и нашёл issue об этом поведении, открытый ровно 24 года назад. Среди ранних комментариев — ссылка на его собственный пост 2002 года с жалобой на ту же самую проблему. Он не просто забыл, что писал об этом. Он забыл о самой проблеме настолько полно, что написал инструмент с тем же багом.

Аналитика

История выглядит курьёзно, но симптом серьёзный. Большинство команд никогда не смотрят на HTTP-заголовки своих приложений — фреймворки абстрагируют этот уровень, и заголовки живут своей жизнью. Добавлен «по умолчанию как правильный SEO-паттерн» — и годами тихо тратит ресурсы. Willison сам указывает на экономику проблемы: лишь крошечная доля посетителей реально переходит на следующую страницу. Это значит, что сервер рендерит страницу целиком — с запросами к базе, с шаблонами, с данными — и выбрасывает результат.

Масштаб потерь зависит от трафика. Для локального инстанса — незначительно. Для публичного Datasette с высокой посещаемостью — реальная нагрузка. Для AI-приложений, где страница данных триггерит embedding-расчёт или LLM-вызов, — потенциально дорого. Это иллюстрирует более широкий принцип: правильный стандарт не равен правильному поведению во всех браузерах. Проверять нужно реальное поведение, а не предполагать его из спецификации.

Fix прагматичный: не отдавать Link: rel=next Firefox для HTML-страниц. Для JSON-ответов и API заголовок остаётся — там prefetch не вредит, а для краулеров полезен. Это хорошая модель: отключать не стандарт целиком, а только вредный его эффект в конкретном клиенте.

Кейсы применения в бизнесе

B2B-SaaS с пагинированными таблицами. Если ваш продукт отдаёт Link: rel=next в HTTP-заголовках ответа — не в HTML-теге, а именно в заголовке — проверьте поведение в Firefox через DevTools → Network. Скорее всего, каждое открытие страницы порождает лишний запрос. Решение простое: не отдавать этот заголовок для HTML-ответов, сохранив его для API и JSON.

Корпоративные дата-платформы и внутренние дашборды. Команды редко включают аудит HTTP-заголовков в performance review. Добавьте в чеклист перед релизом: curl -I https://ваш-домен/список — и посмотрите на Link:, Cache-Control, ETag. Занимает пять минут, закрывает целый класс скрытых утечек.

Малый бизнес в КР/СНГ с собственными порталами или CMS. Некоторые SEO-плагины добавляют Link: rel=next автоматически. Если у вас аномально высокое число запросов при невысоком реальном трафике — стоит проверить HTTP-слой, а не только код на странице.

Кейсы в личной жизни

Разработчик, строящий AI-инструменты или локальные дата-приложения. Проверьте, какие заголовки отдаёт ваш фреймворк «из коробки». FastAPI, Next.js, Django иногда добавляют навигационные заголовки без явной настройки. Команда curl -I :8000/endpoint покажет всё за секунду — до того, как это обнаружат пользователи.

Data analyst, работающий с Datasette. Если вы публикуете датасеты через Datasette — обновитесь до версии с исправлением issue #3046. Снизите лишнюю нагрузку на хост и немного — затраты на трафик.

Начинающий разработчик. История про 24-летний баг — практическое напоминание: браузеры ведут себя по-разному, даже при одном стандарте. Привычка смотреть в DevTools → Network не только на код ответа, но и на заголовки, формирует точное понимание того, что происходит между клиентом и сервером. Это навык, который окупается быстро.

Как применить сегодня

  • Откройте Firefox, перейдите на пагинированную страницу своего сервиса, откройте DevTools → Network — проверьте, нет ли автоматических запросов сразу после загрузки.
  • Проверьте HTTP-заголовки командой curl -I https://ваш-сайт.com/список — ищите строки с Link: и rel=next.
  • Если используете Datasette — обновитесь до версии с фиксом issue #3046.
  • Добавьте аудит HTTP-заголовков в performance-чеклист: отдельно для HTML-ответов и отдельно для API/JSON.
  • Для AI-приложений с пагинированными источниками данных убедитесь, что prefetch не триггерит лишние LLM-вызовы или embedding-расчёты на сервере.
← Все статьи