Typowym i prostym rozwiązaniem tego problemu, które wygląda jak włamanie, ale jest dość przenośne, jest dodanie losowo wygenerowanego ciągu zapytania do każdego żądania dotyczącego obrazu dynamicznego.
Na przykład -
<img src="image.png" />
Stanie się
<img src="image.png?dummy=8484744" />
Lub
<img src="image.png?dummy=371662" />
Z punktu widzenia serwera internetowego dostęp do tego samego pliku jest możliwy, ale z punktu widzenia przeglądarki nie można wykonać buforowania.
Generowanie liczb losowych może odbywać się na serwerze podczas udostępniania strony (po prostu upewnij się, że sama strona nie jest buforowana ...) lub na kliencie (przy użyciu JavaScript).
Będziesz musiał sprawdzić, czy Twój serwer WWW może sobie z tym poradzić.
Strategie buforowania przeglądarki mogą być kontrolowane przez nagłówki HTTP. Pamiętaj, że tak naprawdę to tylko podpowiedź. Ponieważ przeglądarki są bardzo niespójne w tym (i każdym innym) polu, będziesz potrzebować kilku nagłówków, aby uzyskać pożądany efekt w różnych przeglądarkach.
źródło
Jeśli chcesz to zrobić dynamicznie w przeglądarce za pomocą javascript, oto przykład ...
źródło
Rozwiązanie 1 nie jest świetne. To działa, ale dodanie hackerskich, losowych lub oznaczonych czasem ciągów zapytań na końcu plików graficznych spowoduje, że przeglądarka ponownie pobierze i buforuje każdą wersję każdego obrazu, za każdym razem, gdy strona jest ładowana, niezależnie od pogody, czy obraz się zmienił na serwerze.
Rozwiązanie 2 jest bezużyteczne. Dodawanie
nocache
nagłówków do pliku obrazu jest nie tylko bardzo trudne do zaimplementowania, ale jest całkowicie niepraktyczne, ponieważ wymaga przewidywania, kiedy będzie to potrzebne z wyprzedzeniem , przy pierwszym ładowaniu dowolnego obrazu, który według Ciebie może się zmienić w pewnym momencie w przyszłości .Wpisz Etags ...
Absolutnie najlepszy sposób znalazłem rozwiązania tego problemu jest użycie Etags wewnątrz .htaccess pliku w katalogu obrazów. Poniższe polecenie nakazuje Apache wysłanie unikalnego skrótu do przeglądarki w nagłówkach pliku obrazu. Ten hash zmienia się tylko wtedy, gdy plik obrazu jest modyfikowany i ta zmiana powoduje ponowne załadowanie obrazu przez przeglądarkę przy następnym żądaniu.
źródło
Sprawdziłem wszystkie odpowiedzi i wydawało się, że najlepsza (a nie jest):
najpierw.
Jeśli jednak dodasz parametr cache = none (które jest statycznym słowem „none”), to nic nie zmienia, przeglądarka nadal ładuje się z pamięci podręcznej.
Rozwiązaniem tego problemu było:
gdzie zasadniczo dodajesz uniksowy znacznik czasu, aby parametr był dynamiczny i nie miał pamięci podręcznej, zadziałało.
Jednak mój problem był trochę inny: ładowałem w locie wygenerowany obraz wykresu php i kontrolowałem stronę za pomocą parametrów $ _GET. Chciałem, aby obraz był odczytywany z pamięci podręcznej, gdy parametr GET adresu URL pozostaje taki sam, i nie buforował, gdy zmieniają się parametry GET.
Aby rozwiązać ten problem, musiałem haszować $ _GET, ale ponieważ jest to tablica, oto rozwiązanie:
Edycja :
Chociaż powyższe rozwiązanie działa dobrze, czasami chcesz udostępniać wersję z pamięci podręcznej do momentu zmiany pliku. (przy powyższym rozwiązaniu całkowicie wyłącza pamięć podręczną dla tego obrazu) Tak więc, aby wyświetlać buforowany obraz z przeglądarki, DO DOPÓKI nastąpi zmiana w użyciu pliku obrazu:
źródło
Wiem, że ten temat jest stary, ale w Google zajmuje bardzo dobre miejsce. Dowiedziałem się, że umieszczenie tego w nagłówku działa dobrze;
źródło
Szukałem tylko rozwiązania tego problemu, a powyższe odpowiedzi nie zadziałały w moim przypadku (i nie mam wystarczającej reputacji, aby je komentować). Okazuje się, że przynajmniej dla mojego przypadku użycia i przeglądarki, której używałem (Chrome na OSX), jedyną rzeczą, która wydawała się zapobiegać buforowaniu, było:
Aby uzyskać kompletność, używam teraz wszystkich 3 opcji „no-cache, no-store, must-revalidate”
Więc w moim przypadku (obsługując dynamicznie generowane obrazy z Flaska w Pythonie), musiałem wykonać następujące czynności, aby mieć nadzieję, że pracowałem w jak największej liczbie przeglądarek ...
źródło
Rozwiązaniem jest zmiana źródła obrazu. Rzeczywiście możesz to zrobić, dodając do obrazu znacznik czasu lub losową liczbę.
Lepiej byłoby dodać sumę kontrolną np. Danych, które reprezentuje obraz. Umożliwia to buforowanie, gdy jest to możliwe.
źródło
Dodajmy jeszcze jedno rozwiązanie do paczki.
Doskonałym rozwiązaniem jest dodanie na końcu unikalnego sznurka.
Poniższe rozwiązanie rozszerza tę metodę i zapewnia zarówno możliwość buforowania, jak i pobieranie nowej wersji po zaktualizowaniu obrazu.
Gdy obraz zostanie zaktualizowany, czas pliku zostanie zmieniony.
Teraz wytwórz obraz:
źródło
Miałem ten problem i pokonywałem się w ten sposób
źródło
Użyłem tego do rozwiązania podobnego problemu ... wyświetlania licznika obrazów (od zewnętrznego dostawcy). Nie zawsze odświeżał się poprawnie. A po dodaniu losowego parametru wszystko działa dobrze :)
Dodałem ciąg daty, aby zapewnić odświeżanie przynajmniej co minutę.
przykładowy kod (PHP):
Powoduje to
src
link taki jak:źródło
Jeśli masz zakodowany adres URL obrazu, na przykład: http://example.com/image.jpg , możesz użyć php, aby dodać nagłówki do obrazu.
Najpierw musisz sprawić, by apache przetwarzał twój plik jpg jako php. Zobacz tutaj: Czy można uruchomić PHP z rozszerzeniem file.php.jpg?
Załaduj obraz (imagecreatefromjpeg) z pliku, a następnie dodaj nagłówki z poprzednich odpowiedzi. Użyj nagłówka funkcji php, aby dodać nagłówki.
Następnie wyślij obraz za pomocą funkcji imagejpeg.
Proszę zauważyć, że zezwolenie php na przetwarzanie obrazów jpg jest bardzo niebezpieczne. Pamiętaj też, że nie testowałem tego rozwiązania, więc to od Ciebie zależy, czy zadziała.
źródło
Proste, wyślij jedną lokalizację nagłówka.
Moja witryna zawiera jeden obrazek, a po wgraniu obrazka nie ma zmian, wtedy dodaję ten kod:
Pracuje dla mnie.
źródło