Jak zmusić klientów do odświeżania plików JavaScript?

595

Obecnie pracujemy w prywatnej wersji beta, dlatego wciąż jesteśmy w trakcie wprowadzania dość szybkich zmian, chociaż oczywiście, ponieważ zużycie zaczyna rosnąć, spowolnimy ten proces. Biorąc to pod uwagę, jednym z problemów, na który napotykamy, jest to, że po opublikowaniu aktualizacji z nowymi plikami JavaScript przeglądarki przeglądarki nadal używają buforowanej wersji pliku i nie widzą aktualizacji. Oczywiście w przypadku wezwania pomocy technicznej możemy po prostu poinformować ich, aby zrobili ctrlF5odświeżenie, aby upewnić się, że otrzymają aktualne pliki z serwera, ale lepiej byłoby to zrobić przed tym czasem.

Naszą obecną myślą jest po prostu dołączyć numer wersji do nazwy plików JavaScript, a następnie po wprowadzeniu zmian, zwiększyć wersję skryptu i zaktualizować wszystkie odwołania. To zdecydowanie kończy pracę, ale aktualizacja referencji na każdym wydaniu może być uciążliwa.

Ponieważ jestem pewien, że nie jesteśmy pierwszymi, którzy sobie z tym poradzą, pomyślałem, że wyrzucę to społeczności. W jaki sposób zapewniasz klientom aktualizację pamięci podręcznej podczas aktualizacji kodu? Jeśli korzystasz z metody opisanej powyżej, czy korzystasz z procesu, który upraszcza zmianę?

AdamB
źródło

Odpowiedzi:

529

O ile mi wiadomo, powszechnym rozwiązaniem jest dodanie ?<version>linku do skryptu src.

Na przykład:

<script type="text/javascript" src="myfile.js?1500"></script>

Zakładam w tym momencie, że nie ma lepszego sposobu niż znaleźć-zamień, aby zwiększyć te „numery wersji” we wszystkich znacznikach skryptu?

Być może system kontroli wersji to dla Ciebie robi? Większość systemów kontroli wersji ma możliwość automatycznego wstrzykiwania numeru wersji na przykład podczas odprawy.

Wyglądałoby to tak:

<script type="text/javascript" src="myfile.js?$$REVISION$$"></script>

Oczywiście zawsze są lepsze rozwiązania takie jak to .

Huppie
źródło
5
Czy ktoś wie, czy IE7 to ignoruje? Wygląda na to, że ignoruję dołączone dane i używasz pliku z pamięci podręcznej podczas testowania w widoku porównywalności IE8.
Shane Reustle,
4
Zawsze wiedziałem, że ciągi zapytania są parą klucz-wartość, jak w? Ver = 123. Dzięki! :)
Ankur-m
6
myślę, że nie chodzi o wyższy lub niższy numer wersji, ale o zmianę wartości dołączonych zmiennych na coś, czego przeglądarka nie mogła jeszcze buforować.
Max Girkens,
2
Niedawno napotkaliśmy ten sam problem i najlepszą rzeczą, jaką mogłem wymyślić, była prosta funkcja dołączająca „? Mod = 123456”, gdzie 123456 był uniksowym znacznikiem czasu zmodyfikowanej daty w pliku. Wydaje się, że to rozwiązuje problemy, a jednocześnie pozwala na buforowanie w stosownych przypadkach. Jednak nadal widziałem, jak przeglądarki całkowicie ignorują tę dyrektywę i używają starego JS, ale nie wiem, czy istnieje elegancka „pełna poprawka”.
VPel
31
Dla świadomości: uważa się to za włamanie. Ta metoda powoduje, że przeglądarka myśli, że określony jest nowy plik, ponieważ po prostu sprawdza pełną nazwę pliku bez interpretowania go. foo.js?1nie jest taka sama jak nazwa foo.js?2, więc przeglądarka pomyśli, że są to dwa różne pliki. Jednym minusem jest to, że oba pliki będą jednocześnie istnieć w pamięci podręcznej użytkowników, zajmując niepotrzebne miejsce.
Lee White,
88

Dołączanie aktualnego czasu do adresu URL jest rzeczywiście powszechnym rozwiązaniem. Możesz jednak również zarządzać tym na poziomie serwera WWW, jeśli chcesz. Serwer można skonfigurować do wysyłania różnych nagłówków HTTP dla plików javascript.

Na przykład, aby wymusić buforowanie pliku na czas nie dłuższy niż 1 dzień, wyślij:

Cache-Control: max-age=86400, must-revalidate

W przypadku wersji beta, jeśli chcesz zmusić użytkownika, aby zawsze otrzymywał najnowsze, użyj:

Cache-Control: no-cache, must-revalidate
Chase Seibert
źródło
3
czy możesz być bardziej szczegółowy?
Kreker
6
Mówi o nagłówkach wysyłanych przez serwer WWW dla każdego pliku. Powinny być konfigurowalne na przykład w Apache. Myślę, że byłby to najlepszy approch
Pierre de LESPINAY,
1
gdzie to skonfigurujesz?
Diego
2
W przypadku aplikacji webowej dla programistów może to być dobre rozwiązanie. W przypadku witryny produkcyjnej, w której nie chcesz na zawsze unieważniać pamięci podręcznej, nie jest to dobre rozwiązanie, chyba że wiesz, że do przeglądarki trafiła każda przeglądarka klienta docelowego. Przypomina mi to potencjalną funkcję serwera WWW: dostosuj parametr maksymalnego wieku zgodnie ze skonfigurowaną datą wdrożenia. To byłoby niesamowite.
Claude Brisson
Chrome WYMAGA tych ustawień, aby poprawnie buforować. Bez nich Chrome będzie buforował plik na zawsze. Mozilla używa znacznie bardziej rozsądnych ustawień domyślnych. Zobacz więcej na: agiletribe.wordpress.com/2018/01/29/caching-for-chrome
AgilePro 30.01.2018
42

Google Page-Speed: nie dołączaj ciągu zapytania do adresu URL zasobów statycznych. Większość serwerów proxy, zwłaszcza Squid w wersji 3.0, nie buforuje zasobów za pomocą „?” w ich adresie URL, nawet jeśli w odpowiedzi występuje nagłówek Cache-control: public. Aby włączyć buforowanie proxy dla tych zasobów, usuń ciągi zapytania z odniesień do zasobów statycznych i zamiast tego zakoduj parametry w samych nazwach plików.

W takim przypadku możesz dołączyć wersję do adresu URL np .: http://abc.com/ v1.2 /script.js i użyć apache mod_rewrite, aby przekierować link do http://abc.com/script.js . Po zmianie wersji przeglądarka klienta zaktualizuje nowy plik.

Hắc Huyền Minh
źródło
Próbowałem? rozwiązanie oraz w IE8 i pojawia się błąd javascript. Mod przepisywanie jest opcją, ale w większości przypadków nie będziemy mieć takiej kontroli nad serwerem. Wolałbym dodać wersję do samego pliku js lub mieć folder dla każdej wersji
Karthik Sankar
@ H Huc Huyền Minh: Ale kiedy skrypt zostanie ponownie załadowany, nie powinien zostać ponownie załadowany z pamięci podręcznej proxy ...
Stefan Steiger
34

To użycie zostało usunięte: https://developer.mozilla.org/en-US/docs/Web/HTML/Using_the_application_cache

Ta odpowiedź jest spóźniona tylko o 6 lat, ale nie widzę tej odpowiedzi w wielu miejscach ... HTML5 wprowadził bufor aplikacji, który służy do rozwiązania tego problemu. Odkryłem, że nowy kod serwera, który piszę, powoduje awarię starego javascript przechowywanego w przeglądarkach ludzi, więc chciałem znaleźć sposób na wygaśnięcie ich javascript. Użyj pliku manifestu, który wygląda następująco:

CACHE MANIFEST
# Aug 14, 2014
/mycode.js

NETWORK:
*

i generuj ten plik z nowym znacznikiem czasu za każdym razem, gdy chcesz, aby użytkownicy aktualizowali pamięć podręczną. Na marginesie, jeśli dodasz to, przeglądarka nie przeładuje się (nawet gdy użytkownik odświeży stronę), dopóki manifest tego nie powie.

Amos
źródło
To rozwiązanie jest naprawdę dobre, o ile pamiętasz aktualizację pliku manifestu :)
Mattis
24
Proszę przeczytać dokumentację, ponieważ ta funkcja została usunięta ze standardu WWW developer.mozilla.org/en-US/docs/Web/HTML/…
Flavia Obreja
1
FWIW, ostatecznie nie korzystałem z tego rozwiązania. ?<version> Podejście było znacznie łatwiejsze w użyciu / utrzymaniu .
amos
28

Co powiesz na dodanie rozmiaru pliku jako parametru ładowania?

<script type='text/javascript' src='path/to/file/mylibrary.js?filever=<?=filesize('path/to/file/mylibrary.js')?>'></script>

Dlatego przy każdej aktualizacji pliku zmienia się parametr „filever”.

Co powiesz na to, kiedy zaktualizujesz plik, a twoja aktualizacja będzie miała ten sam rozmiar? jakie są szanse?

Erik Corona
źródło
4
Wykorzystuje to tagi PHP, a jeśli ktoś używa PHP, to naprawdę dobry pomysł.
Jerther
1
Myślę, że dodanie zmienionego byłoby lepsze niż rozmiar pliku :)
Mazz
2
Moją początkową myślą jest dodanie skrótu pliku zamiast wersji.
Mike Cheel
Zakładam, że to działa również po dodaniu znacznika czasu Unix, prawda? np. '... file.js? filever = <? = time ()?>
garanda
3
użyj filemtime ($ file) wyprowadza znacznik czasu pliku, z time () nie możesz używać pamięci podręcznej, ponieważ zmienia się co sekundę.
neoteknic
19

Nie wszystkie przeglądarki buforują pliki za pomocą „?”w tym. To, co zrobiłem, aby upewnić się, że jest buforowane w jak największym stopniu, umieściłem wersję w nazwie pliku.

Więc zamiast tego stuff.js?123zrobiłemstuff_123.js

Użyłem mod_redirect(tak myślę) w apache, have stuff_*.jsaby przejśćstuff.js

Echo mówi Przywróć Monikę
źródło
Czy mógłbyś opisać, co zrobiłeś w .htaccess z mod_redirect?
Venkat D.
3
Szczegółowe wyjaśnienie tej metody można znaleźć na stronie szczegletree.com/notebook/...
Karl Bartel,
3
Byłoby wspaniale, gdybyś mógł dołączyć swój .htaccesskod do swojej odpowiedzi na przyszłość.
Fizzix,
1
Które przeglądarki nie buforują plików za pomocą „?” w tym?
rosell.dk,
13

Do stron ASP.NET używam następujących

PRZED

<script src="/Scripts/pages/common.js" type="text/javascript"></script>

PO (wymuszenie przeładowania)

<script src="/Scripts/pages/common.js?ver<%=DateTime.Now.Ticks.ToString()%>" type="text/javascript"></script>

Dodanie DateTime.Now.Ticks działa bardzo dobrze.

Ravi Ram
źródło
31
Ten jest sprzeczny z całym mechanizmem buforowania po stronie klienta. fikcyjny parametr powinien zostać zastąpiony czymś takim jak „{wersja główna} _ {wersja_pomocnicza} _ {numer_budowy} _ {Wersja}, który byłby unikalny dla każdej wersji.
Tohid
14
Chociaż jest to prawdopodobnie dobre rozwiązanie w środowisku programistycznym, nie nadaje się do produkcji. Spowoduje to całkowite wyłączenie pamięci podręcznej za każdym razem, gdy strona zostanie załadowana do pliku. Wyobraź sobie obciążenie 10 000 stron dziennie z jednym plikiem 50 KB, co stanowi 500 MB pliku JavaScript na co dzień.
PhilDulac
@PhilDulac możesz zmienić to z Ticks, aby na przykład zwrócić wartość ciągu dnia, miesiąca lub tygodnia miesiąca. Ostatecznie pokazuje tylko, jak korzystać z podejścia? V
alex
3
@alex Rzeczywiście. Chciałem tylko ostrzec, że jeśli użycie pokazane w odpowiedzi trafi do produkcji, może mieć wpływ, którego nie widać w rozwoju.
PhilDulac
2
Możliwym sposobem upewnienia się, że nowe kopie są ładowane raz dziennie, może być użycie typu <<skrypt src = "/ Scripts / pages / common.js? Ver <% = DateTime.Now.ToString (" rrrrMMdd ")%>" = "text / javascript"> </script> '. Więc jest ładowany raz na początku dnia, a następnie buforowany.
Robb Sadler,
7

Dla ASP.NET przypuszczam, że następne rozwiązanie z zaawansowanymi opcjami (tryb debugowania / wydania, wersje):

Pliki Js lub Css zawarte w ten sposób:

<script type="text/javascript" src="Scripts/exampleScript<%=Global.JsPostfix%>" />
<link rel="stylesheet" type="text/css" href="Css/exampleCss<%=Global.CssPostfix%>" />

Global.JsPostfix i Global.CssPostfix jest obliczany w następujący sposób w Global.asax:

protected void Application_Start(object sender, EventArgs e)
{
    ...
    string jsVersion = ConfigurationManager.AppSettings["JsVersion"];
    bool updateEveryAppStart = Convert.ToBoolean(ConfigurationManager.AppSettings["UpdateJsEveryAppStart"]);
    int buildNumber = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.Revision;
    JsPostfix = "";
#if !DEBUG
    JsPostfix += ".min";
#endif      
    JsPostfix += ".js?" + jsVersion + "_" + buildNumber;
    if (updateEveryAppStart)
    {
        Random rand = new Random();
        JsPosfix += "_" + rand.Next();
    }
    ...
}
Ivan Kochurkin
źródło
Używam .Ticks (patrz moja odpowiedź na tej stronie)
Ravi Ram
5

Obecnie powszechną praktyką jest generowanie kodu skrótu treści jako części nazwy pliku, aby zmusić przeglądarkę, szczególnie IE, do ponownego załadowania plików javascript lub plików css.

Na przykład,

sprzedawca. a7561fb0e9a071baadb9 .js
main. b746e3eb72875af2caa9 .js

Generalnie jest to zadanie dla narzędzi do budowania, takich jak webpack. Oto więcej szczegółów, jeśli ktoś chce wypróbować, jeśli używasz pakietu internetowego.

kod Schrodingera
źródło
4

Jeśli generujesz stronę z linkami do plików JS, prostym rozwiązaniem jest dodanie znacznika czasu ostatniej modyfikacji pliku do wygenerowanych linków.

Jest to bardzo podobne do odpowiedzi Huppie, ale działa w systemach kontroli wersji bez podstawiania słów kluczowych. Jest to również lepsze niż dodawanie aktualnego czasu, ponieważ zapobiegnie to buforowaniu, nawet jeśli plik w ogóle się nie zmieni.


źródło
Podoba mi się to rozwiązanie, ponieważ jest najłatwiejsze w utrzymaniu. Jeśli zaktualizujesz plik .js, to wszystko, co musisz zrobić. Nie trzeba także aktualizować żadnych odniesień do pliku, ponieważ kod automatycznie doda ostatnią zaktualizowaną sygnaturę czasową.
NL3294,
3

Funkcji jQuery getScript można również użyć do zapewnienia, że ​​plik js jest rzeczywiście ładowany za każdym razem, gdy strona jest ładowana.

Oto jak to zrobiłem:

$(document).ready(function(){
    $.getScript("../data/playlist.js", function(data, textStatus, jqxhr){
         startProgram();
    });
});

Sprawdź funkcję na stronie http://api.jquery.com/jQuery.getScript/

Domyślnie $ .getScript () ustawia ustawienie pamięci podręcznej na false. To dodaje parametr zapytania z datownikiem do adresu URL żądania, aby zapewnić, że przeglądarka pobierze skrypt za każdym razem, gdy zostanie o to poproszony.

Michael Franz
źródło
8
Musimy buforować pliki, jeśli nie nastąpią żadne zmiany.
Leo Lee
3

W PHP :

function latest_version($file_name){
    echo $file_name."?".filemtime($_SERVER['DOCUMENT_ROOT'] .$file_name);
}

W HTML :

<script type="text/javascript" src="<?php latest_version('/a-o/javascript/almanacka.js'); ?>">< /script>

Jak to działa:

W HTML, napisz filepathi nazwij jak chcesz, ale tylko w funkcji. PHP pobiera filetimeplik i zwraca filepath+name+"?"+timeostatnią zmianę

użytkownik1944129
źródło
3

Tworzymy SaaS dla użytkowników i udostępniamy im skrypt do dołączenia na stronie ich witryny, a nie było możliwe załączenie wersji ze skryptem, ponieważ użytkownik dołącza skrypt do swojej witryny pod kątem funkcjonalności i nie mogę ich zmusić zmieniać wersję za każdym razem, gdy aktualizujemy skrypt

Znaleźliśmy sposób na ładowanie nowszej wersji skryptu za każdym razem, gdy użytkownik wywoła oryginalny skrypt

link do skryptu udostępniony użytkownikowi

<script src="https://thesaasdomain.com/somejsfile.js" data-ut="user_token"></script>

plik skryptu

if($('script[src^="https://thesaasdomain.com/somejsfile.js?"]').length !== 0) {
   init();
} else {
   loadScript("https://thesaasdomain.com/somejsfile.js?" + guid());
}

var loadscript = function(scriptURL) {
   var head = document.getElementsByTagName('head')[0];
   var script = document.createElement('script');
   script.type = 'text/javascript';
   script.src = scriptURL;
   head.appendChild(script);
}

var guid = function() {
    return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
        var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);
        return v.toString(16);
    });
}

var init = function() {
    // our main code
}

Wyjaśnienie:

Użytkownik załączył dostarczony im skrypt na swojej stronie internetowej i sprawdziliśmy, czy istnieje unikalny token dołączony do skryptu lub nie używa on selektora jQuery, a jeśli nie, to załaduj go dynamicznie nowszym tokenem (lub wersją)

Nazywa się to dwukrotnie tym samym skryptem, co może być problemem z wydajnością, ale naprawdę rozwiązuje problem zmuszania skryptu, aby nie ładował się z pamięci podręcznej bez umieszczenia wersji w rzeczywistym łączu skryptu podanym użytkownikowi lub klientowi

Oświadczenie: Nie używaj, jeśli wydajność jest dużym problemem w twoim przypadku.

Aman Singh
źródło
2

W asp.net mvc możesz użyć @ DateTime.UtcNow.ToString () dla numeru wersji pliku js. Automatyczna zmiana numeru wersji wraz z datą i zmuszanie przeglądarki klienta do automatycznego odświeżania pliku js. Korzystam z tej metody i działa to dobrze.

<script src="~/JsFilePath/[email protected]()"></script>
Dragonal
źródło
Podobnie jak w przypadku innych sugerowanych rozwiązań, spowoduje to, że plik nigdy nie będzie buforowany, co zwykle jest niepożądane. Dopóki nie zostaną wprowadzone żadne zmiany w pliku, prawdopodobnie chcesz, aby klient używał wersji z pamięci podręcznej zamiast pobierać niezmieniony plik za każdym razem.
Philip Stratford
Możesz użyć poniższego kodu ze swojego powodu, pliku pamięci podręcznej o numerze wersji <script src = "~/JsFilePath/JsFile.js?v=@GetAppVersionNumber ()"> </script>
dragonal
2

location.reload (true);

patrz https://www.w3schools.com/jsref/met_loc_reload.asp

Dynamicznie wywołuję ten wiersz kodu, aby upewnić się, że javascript został ponownie pobrany z serwera WWW zamiast z pamięci podręcznej przeglądarki w celu uniknięcia tego problemu.

Megan
źródło
Dodanie onload="location.reload();"do mojego formularza pozwala mi uzyskać nowy JS po odświeżeniu zamiast ponownego uruchamiania mojej strony. To znacznie bardziej eleganckie rozwiązanie. Dzięki!
ZX9,
Dzięki, mógłbym użyć tego do sprawdzenia, czy ip jest rozpoznawany, ale nie został użyty do zalogowania się od czasu ostatniej aktualizacji, wykonaj to na stronie indeksu po pierwszym zalogowaniu użytkownika.
Fi Horan
onload = "location.reload (true);" Powyższe nie działało dla mnie (przy użyciu kolby i bieżącej wersji Chrome) również: w3schools.com/jsref/met_loc_reload.asp
aspiringGuru
1

Jednym z rozwiązań jest dołączenie ciągu zapytania ze znacznikiem czasu do adresu URL podczas pobierania zasobu. Wykorzystuje to fakt, że przeglądarka nie buforuje zasobów pobranych z adresów URL zawierających ciągi zapytań.

Prawdopodobnie nie chcesz, aby przeglądarka w ogóle nie buforowała tych zasobów; bardziej prawdopodobne jest, że chcesz je buforować, ale chcesz, aby przeglądarka pobierała nową wersję pliku, gdy jest on dostępny.

Najczęstszym rozwiązaniem wydaje się osadzenie znacznika czasu lub numeru wersji w samej nazwie pliku. Jest to trochę więcej pracy, ponieważ kod musi zostać zmodyfikowany, aby zażądać poprawnych plików, ale oznacza to, że np. Wersja 7 twojego snazzy_javascript_file.js(tj. snazzy_javascript_file_7.js) Jest buforowana w przeglądarce aż do wydania wersji 8, a następnie twój kod zmienia się na pobierz snazzy_javascript_file_8.jszamiast tego.

Richard Turner
źródło
1

Zaletą korzystania z file.js?V=1ponad fileV1.jsto, że nie trzeba do przechowywania wielu wersji plików JavaScript na serwerze.

Problem, który widzę, file.js?V=1polega na tym, że możesz mieć kod zależny w innym pliku JavaScript, który psuje się podczas korzystania z nowej wersji narzędzi bibliotecznych.

Ze względu na zgodność z poprzednimi wersjami uważam, że znacznie lepiej jest używać jQuery.1.3.jsnowych stron i zezwalać na korzystanie z istniejących stron jQuery.1.1.js, dopóki nie będzie można zaktualizować starszych stron, jeśli to konieczne.


źródło
1

Użyj GETzmiennej wersji , aby zapobiec buforowaniu przeglądarki.

Dołączenie ?v=AUTO_INCREMENT_VERSIONna końcu adresu URL zapobiega buforowaniu przeglądarki - unikając wszystkich buforowanych skryptów.

Derek Adair
źródło
1

Mój kolega właśnie znalazł odniesienie do tej metody zaraz po tym, jak opublikowałem (w odniesieniu do css) na stronie http://www.stefanhayden.com/blog/2006/04/03/css-caching-hack/ . Dobrze widzieć, że inni go używają i wydaje się, że działa. Zakładam w tym momencie, że nie ma lepszego sposobu niż znaleźć-zamień, aby zwiększyć te „numery wersji” we wszystkich znacznikach skryptu?

AdamB
źródło
1

Mimo że jest specyficzny dla ram, Django 1.4 ma tę funkcję, która działa w podobny sposób, jak link do strony „zielonej” w powyższej odpowiedzi

Trent
źródło
1

Pomijanie pamięci podręcznej w programie ASP.NET Core za pomocą pomocnika tagów zajmie się tym i pozwoli twojej przeglądarce przechowywać skrypty / css w pamięci podręcznej do momentu zmiany pliku. Po prostu dodaj tag pomocnika asp-append-version = "true" do tagu skryptu (js) lub linku (css):

<link rel="stylesheet" href="~/css/site.min.css" asp-append-version="true"/>

Dave Paquette ma dobry przykład i wyjaśnienie CacheBuster tutaj (na dole strony) Pomijanie pamięci podręcznej

ccherwin
źródło
Czy to nie działa w zwykłym ASP.NET? Próbowałem dodać wersję asp-append do mojego tagu skryptu, a wszystko, co przeglądarka widzi, to tag skryptu dokładnie taki, jaki pojawia się w źródle, w tym atrybut asp-append-version.
tolsen64
Jest to atrybut .NET Core powiązany z Tag Helpers. Dodaje nazwę skryptu do wersji, dzięki czemu serwer / przeglądarka zawsze widzi najnowszą wersję i pobiera pliki
ccherwin
0

Najprostsze rozwiązanie? Nie pozwól, aby przeglądarka w ogóle buforowała. Dołącz aktualny czas (w ms) jako zapytanie.

(Wciąż jesteś w fazie beta, więc możesz uzasadnić brak optymalizacji pod kątem wydajności. Ale YMMV tutaj.)

pcorcoran
źródło
13
IMHO to złe rozwiązanie. Co jeśli nie jesteś w wersji BETA i wypychasz ważną aktualizację?
d -_- b
0

Jeden prosty sposób. Edytuj htaccess

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_URI} \.(jpe?g|bmp|png|gif|css|js|mp3|ogg)$ [NC]
RewriteCond %{QUERY_STRING} !^(.+?&v33|)v=33[^&]*(?:&(.*)|)$ [NC]
RewriteRule ^ %{REQUEST_URI}?v=33 [R=301,L]
Goran Siriev
źródło
Powoduje to przekierowanie, które pod względem wydajności jest nieoptymalnym, ale działającym rozwiązaniem.
twicejr
0

Poniżej pracował dla mnie:

<head>
<meta charset="UTF-8">
<meta http-equiv="cache-control" content="no-cache, must-revalidate, post-check=0, pre-check=0" />
<meta http-equiv="cache-control" content="max-age=0" />
<meta http-equiv="expires" content="0" />
<meta http-equiv="expires" content="Tue, 01 Jan 1980 1:00:00 GMT" />
<meta http-equiv="pragma" content="no-cache" />
</head>
H.Ostwal
źródło