Chcemy buforować błędy we wdrożeniach produkcyjnych, ale nie tracić czasu na wymyślanie odpowiedniego systemu. Pomyślałem o zastosowaniu parametru na końcu plików css i js o aktualnym numerze wersji:
<link rel="stylesheet" href="base_url.com/file.css?v=1.123"/>
Dwa pytania: czy to skutecznie zepsuje pamięć podręczną? Czy parametr spowoduje, że przeglądarka nigdy nie będzie buforować odpowiedzi z tego adresu URL, ponieważ parametr wskazuje, że jest to zawartość dynamiczna?
źródło
<link rel="stylesheet" href="style.css?v=1487935578" />
Tak. Nawet Stack Overflow używają tej metody, chociaż pamiętam, że oni (z milionami odwiedzających dziennie i milionami różnych wersji i konfiguracji klienta i proxy) mieli kilka dziwacznych przypadków, w których nawet to nie wystarczyło, aby złamać pamięć podręczną. Ale ogólne założenie jest takie, że to zadziała i jest odpowiednią metodą do przerwania buforowania na klientach.
Nie. Parametr nie zmieni zasad buforowania; nagłówki pamięci podręcznej wysłane przez serwer nadal obowiązują, a jeśli nie wysyła żadnych, ustawienia domyślne przeglądarki.
źródło
/static/v22/file.css
, ponieważ możesz zrobić wiele plików z jedną zmianą nazwy folderu, np./static/v23/file.css
I/static/v23/mystuff.js
Bezpieczniej jest umieścić numer wersji w rzeczywistej nazwie pliku. Umożliwia to jednoczesne istnienie wielu wersji, dzięki czemu można wdrożyć nową wersję, a jeśli w pamięci podręcznej nadal istnieją strony HTML, które żądają starszej wersji, otrzymają wersję, która działa z ich kodem HTML.
Uwaga: w jednym z największych wdrożeń wersjonowanych w dowolnym miejscu w Internecie jQuery używa numerów wersji w rzeczywistej nazwie pliku i bezpiecznie umożliwia współistnienie wielu wersji bez specjalnej logiki po stronie serwera (każda wersja jest po prostu innym plikiem).
Spowoduje to jednorazowe zerwanie pamięci podręcznej podczas wdrażania nowych stron i nowych połączonych plików (co jest tym, czego chcesz) i od tego momentu te wersje mogą być skutecznie buforowane (co również chcesz).
źródło
Jak powiedzieli inni, niszczenie pamięci podręcznej za pomocą parametru zapytania jest zwykle uważane za zły pomysł (tm) i było tak od dawna. Lepiej jest odzwierciedlić wersję w nazwie pliku. Html5 Gotowa odradza użyciu ciąg kwerendy, między innymi.
To powiedziawszy, spośród zaleceń, które widziałem, a które przytoczyły źródło, wszystkie wydają się czerpać swoją mądrość z artykułu Steve'a Soudersa z 2008 roku . Jego wnioski opierają się na zachowaniu serwerów proxy w tamtym czasie i obecnie mogą, ale nie muszą, mieć znaczenie. Mimo to, w przypadku braku bardziej aktualnych informacji, bezpieczną opcją jest zmiana nazwy pliku.
źródło
Spowoduje to jednorazowe zniszczenie pamięci podręcznej, po pobraniu zasobu przez klienta każda inna odpowiedź będzie obsługiwana z pamięci podręcznej klienta, chyba że:
źródło
Ogólnie powinno to wystarczyć, ale możliwe jest, że nie zadziała, jeśli istnieje pośrednia pamięć podręczna (proxy), która jest skonfigurowana tak, aby ignorować parametry żądania.
Na przykład, jeśli udostępniasz statyczną zawartość przez Akamai CDN, można ją skonfigurować tak, aby ignorowała parametry żądania, aby zapobiec pomijaniu pamięci podręcznej przy użyciu tej metody.
źródło
W dużej mierze zależy to od tego, jak solidne ma być buforowanie. Na przykład serwer proxy squid (i być może inne) domyślnie nie buforuje adresów URL obsługiwanych z zapytaniem - przynajmniej tak było, gdy pisano ten artykuł. Jeśli nie masz nic przeciwko niektórym przypadkom użycia powodującym niepotrzebne chybienia w pamięci podręcznej, przejdź dalej z parametrami zapytania. Ale bardzo łatwo jest skonfigurować schemat niszczenia pamięci podręcznej oparty na nazwie pliku, który pozwala uniknąć tego problemu.
źródło
Znalazłem porównanie dwóch technik (ciąg zapytania vs nazwa pliku) tutaj :
Wersja jako querystring ma dwa problemy.
źródło
Innym podobnym podejściem jest użycie htaccess mod_rewrite w celu zignorowania części ścieżki podczas udostępniania plików. Twoja nigdy nie buforowana strona indeksu odwołuje się do najnowszej ścieżki do plików.
Z punktu widzenia programowania jest to tak proste, jak użycie parametrów dla numeru wersji, ale jest tak solidne, jak podejście do nazwy pliku.
Użyj zignorowanej części ścieżki dla numeru wersji, a serwer po prostu go zignoruje i wyświetli plik niebuforowany.
1.2.3/css/styles.css
obsługuje ten sam plik,css/styles.css
ponieważ pierwszy katalog jest usuwany i ignorowany przez plik htaccessW tym wersjonowane pliki
Zauważ, że to podejście oznacza, że musisz wyłączyć buforowanie swojej strony indeksu - używając tagów <meta>, aby wyłączyć buforowanie we wszystkich przeglądarkach?
Plik .htaccess
Możesz zastosować to samo podejście na dowolnej platformie serwerowej, która umożliwia przepisywanie adresów URL
(warunek przepisania dostosowany z mod_rewrite - przepisanie katalogu do ciągu zapytania z wyjątkiem / #! / )
... a jeśli potrzebujesz pomijania pamięci podręcznej dla strony indeksu / punktu wejścia witryny, zawsze możesz użyć JavaSript, aby ją odświeżyć.
źródło
źródło
źródło
Mam nadzieję, że to powinno pomóc ci wstrzyknąć zewnętrzny plik JS
Źródło - kod Cachebuster w JavaScript
źródło