2009-09-16 17 views
26

Mam problem polegający na tym, że użytkownicy zgłaszają, że ich zdjęcia nie są przesyłane, a stare nadal tam są. Przy bliższym przyjrzeniu się pojawiają się nowe obrazy, mają po prostu taką samą nazwę jak stara. To, co robię podczas przesyłania, to zmiana nazwy obrazów na potrzeby SEO. Gdy usuwają obraz, stary indeks staje się dostępny i jest ponownie wykorzystywany. Dlatego ma tę samą nazwę obrazu.Czy istnieje sposób na zmuszenie przeglądarek do odświeżania/pobierania obrazów?

Czy istnieje sposób (pomyślałem, że może być metatag), aby poinformować przeglądarkę, aby nie korzystała z jego cahce?

Lepszą odpowiedzią jest zmiana nazwy obrazu na coś zupełnie nowego. Będę pracował nad tym, ale w międzyczasie jest to szybkie rozwiązanie, podczas gdy ja pracuję nad większym problemem.

Odpowiedz

81

Dołącz ciąg kwerendy z dowolnego unikalnego numeru (lub czasu lub numeru wersji, etc.):

<img src="image.png?80172489074" alt="a cool image" /> 

Spowoduje to nowy wniosek, ze względu na inny adres URL.

+2

+1, ale ściśle mówiąc nie jest to inna nazwa pliku ;-) Komponent nazwy pliku jest taki sam, ale adres URL jest z pewnością inny. –

+8

Gubmo, unikatowy to trochę za dużo, najlepsze w tym przypadku byłoby dodanie mtime pliku - w ten sposób zostanie ono ponownie załadowane tylko w razie potrzeby. –

+2

Najlepszym sposobem będzie użycie numeru wersji wydania. – rahul

2

Możesz kontrolować zachowanie pamięci podręcznej, grając z nagłówkami HTTP.

ustawienie poprzedniego nagłówka expires zmusiłoby przeglądarkę do nieużywania wersji buforowanej.

Expires: Sat, 26 Jul 1997 05:00:00 GMT 

Można skonsultować się z RFC mieć więcej szczegółów.

+1

RageZ problemem jest to, że będziesz musiał również poprosić niektórych programistów przeglądarki o zapoznanie się z RFC. –

+0

tak ... ale przynajmniej ten odpowiedni dokument. po usterce implementacji jest ... – RageZ

+0

Jestem za prawidłowym wdrożeniem, ale musimy poradzić sobie z rzeczywistością. –

4

Można umieścić http-equiv w <meta> tag który powie przeglądarkę, aby nie używać pamięci podręcznej (lub nawet lepiej - użyj go w pewien określony sposób), ale lepiej jest skonfigurowanie serwera do wysyłania prawidłowego nagłówki HTTP cache. Sprawdź article on caching.

Mimo to niektóre przeglądarki mogą nie obsługiwać wszystkich standardów http, ale uważam, że jest to właściwy sposób.

+0

To jest droga, jeśli planujesz zrobić to za pomocą książki. – Mike

+0

Przeciwnie, używanie obejść wspiera złe wsparcie przeglądarek dla tych pomysłów;) Rozumiem twoją sprawę, i wiem, że dalsza dyskusja zwykle prowadzi donikąd - coś jest "lepsze", ale nie działa zgodnie z zamierzeniami, coś jest "gorsze", ale robię praca. Wszystko zależy od webdev, co wybierze. – samuil

+0

samuil, właściwie * kogo * (ów) chce dla widowni ;-) –

1

Jeśli spojrzysz na dane wymieniane między przeglądarką a serwerem, zobaczysz, że przeglądarka wyśle ​​żądanie HTTP HEAD dla obrazów. Wynik będzie zawierał czas modyfikacji (ale nie rzeczywiste dane obrazu). Upewnij się, że ten czas się zmienia, jeśli obraz zmienia się na serwerze, a przeglądarka powinna pobrać obraz ponownie.

+0

Zależnie od przeglądarki - technika o niższym opóźnieniu polega na użyciu nagłówka 'If-Modified-Since' w żądaniu' GET'. Konsekwencja jest wciąż taka sama - upewnij się, że poprawnie raportujesz czas modyfikacji pliku, aby unieważnianie pamięci podręcznej działało poprawnie. –

13

To jest trudne. Naprawdę chcesz, aby obrazy były buforowane, ale nie chcesz ich buforować po udostępnieniu nowych:

  • Użycie nagłówka wygasania z datą w przeszłości zapobiega buforowaniu. Zły
  • Dodanie parametru "pomijanie pamięci podręcznej" 342038402 może naprawić problem, ale może również zapobiec buforowaniu obrazu, co nie jest tym, czego potrzebujesz. Zły.
  • Używanie wygasającego nagłówka z krótkim (powiedzmy 1 godz.) Wygasa, jest lepsze ... po godzinie użytkownik zobaczy obraz, ale serwer internetowy nie będzie musiał go wyświetlać za każdym razem. Kompromis, ale która godzina działa? Naprawdę niewykonalne.

Rozwiązanie? Mogę myśleć o dwóch dobrych opcji:

  • Look w Etags i zdolność do korzystania z nich. Są one zaprojektowane do tej sytuacji. Przeglądarka wyraźnie zapyta serwer, czy plik jest aktualny, czy nie.Możesz po prostu włączyć to w Apache, jeśli go nie masz.
  • Utwórz nowy adres URL dla każdego nowego obrazu (i użyj nagłówka o wygasłej przyszłości). Nad tym pracujesz.
+1

"Dodawanie" pomijania pamięci podręcznej "... Złe." To nie jest prawda, zmusi przeglądarkę do zapisania w pamięci podręcznej tych konkretnych wersji obrazu, więc image.png? 342038402 będzie buforowany w tej wersji. Jeśli masz ten sam obraz z innym ciągiem zapytania, który jest zły. – michaelmol

+0

michaelmol, ale za każdym razem, gdy obraz zostanie zmieniony, będziesz musiał ręcznie utworzyć nową losową liczbę? Rozumiem, że nie chcesz, żeby nigdy nie buforował. za pomocą tej techniki nie widzę sposobu, aby po prostu przesłać obraz do jego lokalizacji o tej samej nazwie i mieć coś programowo aktualizować ścieżkę z nową losową liczbą –

+2

@ChadMizner Jeśli korzystasz z PHP, możesz użyć PHP ['filemtime (ciąg znaków $ filename) '] (http://php.net/manual/en/function.filemtime.php) funkcja w połączeniu z parametrem" pomijania pamięci podręcznej ". W ten sposób adres URL tego pliku zmieni się za każdym razem, zmieniony zostanie żądany plik. (Podziękowania dla Michaela Krelina - hakera). – RicoBrassers

3

Dołącz bieżący datetime do src obrazu:

<img src="yourImage.png?v=<?php echo Date("Y.m.d.G.i.s")?>" /> 
+0

Można równie dobrze wyłączyć buforowanie, ponieważ twój przykład zmusi przeglądarki do pobierania plików za każdym razem (ponieważ znacznik czasu zmieni się co sekundę). Proponuję usunąć i i s na końcu, więc znacznik czasu zmienia się co godzinę. W ten sposób przeglądarki będą pobierać obrazy tylko raz na godzinę. "Y.m.d.G" – Shumoapp

0

W PHP można wysłać liczbę losową lub aktualny timestamp:

<img src="image.jpg?<?=Date('U')?>"> 

lub

<img src="image.jpg?<?=rand(1,32000)?>"> 
-1

to nie było w porządku, myślę, że to jest sposób na zaprogramowanie tego poprawny.

<td><?php echo "<img heigth=90 width=260 border=1 vspace=2 hspace=2 src=".$row['address']."?=".rand(1,999)."/>" ?></td> 
1

w PHP można użyć tej sztuczki

<img src="image.png?<?php echo time(); ?>" /> 

funkcji czasu() pokazują aktualny timestamp. Każde ładowanie strony jest inne. Kod ten oszukuje przeglądarkę: czyta inną ścieżkę i "myśli", że obraz został zmieniony, ponieważ użytkownik odwiedził witrynę po raz ostatni. I trzeba go ponownie pobrać, zamiast korzystać z pamięci podręcznej.

+0

......... lepiej teraz? –

0

Przejdź losowo. Po prostu użyj pewnej liczby losowej i dołącz ją do pliku obrazu.

<img src="image.jpg?<?=rand(1,1000000)?>"> 
Powiązane problemy