Static SDK, dynamic API: splitting cache rules on one domainСтатичный SDK, динамичный API: разные правила кэша на одном домене
Serving everything from one delivery domain keeps integration simple — one host, one TLS cert. But a single domain carries two opposite needs: the SDK bundle wants to be cached for as long as possible, and the session API must never be cached at all.
The split is by path prefix:
# cache hard /sdk/player.js → Cache-Control: public, max-age=3600 # never cache /api/ → Cache-Control: no-store, bypass at edge
On the CDN we mark the /api/ prefix as bypass and let static extensions cache normally. The origin reinforces it with no-store on dynamic responses, so even a misconfigured edge can't accidentally pin a session delta.
The gotcha
Query strings. If the edge folds ?offset=1 and ?offset=2 into one cache key, every poll returns the same stale delta. Disable query-string caching for the session path — or just bypass the whole prefix, which is what we do.
Отдавать всё с одного домена раздачи удобно — один хост, один TLS-сертификат. Но один домен несёт две противоположные потребности: бандл SDK хочет кэшироваться как можно дольше, а session API нельзя кэшировать вообще.
Разделение — по префиксу пути:
# кэшируем жёстко /sdk/player.js → Cache-Control: public, max-age=3600 # не кэшируем никогда /api/ → Cache-Control: no-store, bypass на edge
На CDN мы помечаем префикс /api/ как bypass, а статичным расширениям даём кэшироваться нормально. Origin подкрепляет это заголовком no-store на динамических ответах, так что даже неправильно настроенный edge не закрепит дельту сессии случайно.
Подвох
Query string. Если edge сворачивает ?offset=1 и ?offset=2 в один ключ кэша, каждый поллинг отдаёт одну и ту же устаревшую дельту. Отключите кэширование по query для session-пути — или просто байпасьте весь префикс, что мы и делаем.