Один URL отдаёт разным устройствам разные версии файла — почему?
Файл размещён по одному URL, test.com/test.exe. Три устройства (iOS, Android, десктопный Chrome) качают его одновременно. Два получают v2, одно — v1. URL на всех трёх одинаковый.
URL: test.com/test.exe (одинаковый на каждом устройстве)
Устройство 1: качает v2
Устройство 2: качает v2
Устройство 3: качает v1 <-- почему старая версия?
Что может заставить один URL отдавать разные версии файла и какими инструментами и заголовками вы бы расследовали? Определите причину.
Вероятные причины: устаревший edge-кэш CDN (один узел держит старую версию), гео- или локале-зависимое согласование контента (заголовки Accept-Language или гео выбирают версию), устаревший локальный кэш браузера или VPN, меняющий выходной узел. Расследуйте, разбирая заголовки запроса/ответа в DevTools или прокси и сравнивая ETag, Last-Modified и Cache-Control между устройствами.
- ✗Считать, что один URL всегда возвращает те же байты
- ✗Игнорировать кэш CDN и гео/локале-согласование контента
- ✗Не сравнивать заголовки
ETag/Last-Modified/Cache-Control
- →Какой заголовок ответа выдаст устаревший edge-узел CDN?
- →Как
Accept-Languageможет дать одному устройству старую сборку?
Ловушка — «один URL = один файл». В реальной системе за CDN и с согласованием контента один и тот же URL законно отдаёт разные байты на разные запросы.
Вероятные причины:
- Устаревший edge-узел CDN — устройство 3 попало на узел, где ещё лежит v1; остальные — на узлы, где уже v2.
- Гео/локале-согласование контента — origin выбирает версию по
Accept-Languageили гео-заголовку, и устройство из другой локали получает другую сборку. - Устаревший локальный кэш браузера — устройство 3 отдало v1 из своего кэша, не сходив на ревалидацию.
- VPN / другой выходной узел — меняет видимый регион, а с ним и отдаваемую версию.
Как расследовать — сравните заголовки ответа между устройствами:
Device 1: ETag: "v2-9f3c" Age: 12 X-Cache: HIT (edge-fra)
Device 2: ETag: "v2-9f3c" Age: 4 X-Cache: HIT (edge-ams)
Device 3: ETag: "v1-2b71" Age: 86400 X-Cache: HIT (edge-sin) <-- старый объект
Разные ETag при одном URL уже доказывают, что отдаются разные артефакты. Большой Age и другой edge-узел указывают на устаревший кэш CDN; совпадающие ETag при разном Accept-Language указывали бы на согласование контента, а Cache-Control покажет, мог ли браузер отдать файл из своего кэша без ревалидации.
Навык рассуждения здесь — понимать, какой атрибут запроса заставляет сервер (или кэш) вернуть другой артефакт.