Wgrywasz na serwer nową wersję aplikację Angular. Klient widzi starą wersję, bo przeglądarka cachuje index.html. Czy ktoś mierzył się z tym problemem?
Znalazłem przyczynę. Używam wtyczki jib-maven-plugin do budowania obrazów dockerowych. Wtyczka dba o to, aby każdy build miał ten sam hash, jeśli zawartość jest identyczna. Dlatego ustawia daty wszystkich plików na 1970. W konfiguracji nie ma opcji, aby zachować oryginalne daty.
A jeśli daty byłyby oryginalne, to skąd by one pochodziły?
Ale czy to by pomogło i przeglądarka za każdym razem by sprawdzała, czy jest nowa wersja?
Jaka jest praktyka we współczesnych aplikacjach?
Z serwera przychodzi:
- Last-Modified: Thu, 01 Jan 1970 00:00:01 GMT
- ETag: 3278434589
Nie ma nagłówka Cache-Control.
Ostatnio rzadko jest wysyłany Last-Modified, a raczej ETag (który się nie zmienia, bo index.html jest ten sam) lub Expires lub Cache-Control.
Potencjalnych rozwiązań jest kilka:
- Cache-Control: no-cache lub must-revalidate dla index.html, a może dla wszystkich plików
- Service Worker, co sprawdza, czy wyszła nowa wersja (używane m.in. w aplikacjach PWA)
- ETag, ale jak go zmienić po wgraniu nowej wersji?
- Inne pomysły?
Używany serwer HTTP to lighttpd. Nie musi być koniecznie ten.
A kiedy przeglądarka sprawdzi, czy są zmiany na serwerze, a kiedy wczyta wersję z pamięci podręcznej bez uderzenia do serwera?