2010-12-27 6 views
20

Wydaje się, że skoro masz oczywisty wpis, a la:Kiedy dokument HTML ma manifest (cache.manifest), jak możesz go usunąć?

<html manifest="cache.manifest"> 

Następnie ta strona (wejście mistrz w pamięci podręcznej) zawsze będą buforowane (przynajmniej przez Safari), dopóki użytkownik ma coś do usunięcia pamięć podręczną, nawet jeśli później usuniesz atrybut manifestu ze znacznika html i zaktualizujesz manifest (zmieniając coś w nim), zmuszając do ponownego załadowania wpisu głównego wraz ze wszystkim innym.

Innymi słowy, jeśli masz:

  • index.html (z oczywistego wyżej)
  • file1.js (wymieniony w manifeście)
  • file2.js (wymieniony w manifeście)
  • cache.manifest (wymienia dwóch JS pliki)

- usunięcie wpisu z manifestu index.html i modyfikowania manifest (więc wygasa przez przeglądarkę i cała zawartość ponownie załadowana) nie powstrzyma tej strony od zachowywania się, jakby nadal była w pełni zapisana w pamięci podręcznej. Jeśli wyświetlisz źródło na index.html, nie zobaczysz już listy manifestów, ale przeglądarka będzie nadal żądać tylko pliku cache.manifest, i dopóki zawartość tego pliku nie zostanie zmieniona, żadne zmiany w żadnym pliku nie będą wyświetlane użytkownik.

Wygląda na dość poważny błąd i jest obecny w wersjach Safari na iOS i Mac. Czy ktoś znalazł sposób na zresetowanie strony i pozbycie się pamięci podręcznej bez interwencji użytkownika?

Odpowiedz

17

Ive badania to samo pytanie, a nie robi wydaje się być api do:

  1. dynamicznie powodować, że strona jest buforowane
  2. dynamicznie powodują, że strona przestaje być buforowana.

Oto najlepsze zasoby znalazłem:

http://www.html5rocks.com/tutorials/appcache/beginner/

http://www.thecssninja.com/javascript/how-to-create-offline-webapps-on-the-iphone

W szczególności ten cytat z pierwszego linku:

Jeśli plik manifestu lub określony w nim zasób nie jest pobierany, cała aktualizacja kończy się niepowodzeniem. Przeglądarka będzie nadal używać starej pamięci podręcznej aplikacji w przypadku takiej awarii.

W przeciwnym razie nic nie wspomina się o rozładowywaniu pamięci podręcznej.

Wydaje się sugerować, że nie możesz wymusić błędu, aby zmusić go do pominięcia. Jednak, jak wspomniano poniżej, specyfikacja sugeruje, że jeśli wystąpi błąd podczas pobierania pliku manifestu, cała pamięć podręczna zostanie usunięta.

w Google Chrome, użytkownik może przejść do następującego adresu URL:

chrome://appcache-internals/

i ręcznie wyłączyć pamięć podręczną. Oczywiście przy następnej wizycie na stronie będzie ona ponownie wyświetlana, jeśli strona ma ustawioną właściwość manifestu.

Jeśli spojrzeć na specyfikacji: 5.6 Offline Web applications

Wydaje się sugerować sytuacji, gdy pamięć podręczna jest usuwany. W szczególności, sekcja 5.6.4.5:

Jeśli pobieranie manifestu nie ze względu na 404 lub 410 odpowiedzi lub równoważne, a następnie uruchomić te kroki pośrednie: Mark grupa cache jako przestarzałe. Ta grupa pamięci podręcznej nie istnieje już w żadnym celu innym niż przetwarzanie obiektów dokumentów już powiązanych z pamięcią podręczną aplikacji w grupie pamięci podręcznej. Jeśli grupa pamięci podręcznej ma pamięć podręczną aplikacji, której flaga kompletności jest niekompletna, odrzuć pamięć podręczną aplikacji.

Następnie mówi:

Jeśli była to próba cache, odrzucić grupa cache całkowicie.

Zasadniczo, jeśli żądanie pliku manifestu pamięci podręcznej powoduje 404, wówczas cała pamięć podręczna powinna zostać odrzucona. Czy próbowałeś, aby serwer zwrócił 404 lub 410, gdy zażądano pliku manifestu pamięci podręcznej? To powinno działać. Sztuką jest tylko zwrócić 404/410 dla stron, które chcesz usunąć manifest (może używając parametrów adresu URL?).

+4

Zwrócenie 404 wydaje się wyładowywać grupę pamięci podręcznej w przeglądarce Chrome. Dzięki za wykonanie badań na ten temat! Próbowałem zwrócić pusty manifest cache i nie zwalnia on zasobów z pamięci podręcznej. –

+2

Potwierdzam, że to działa. Musisz ponownie załadować stronę, aby zobaczyć wynik. – Soska

4

Jedną z możliwości:

  • modyfikować oczywisty (tak, że wczytuje)
  • modyfikacji główny plik (index.html), aby odwołać się do nieistniejącego ładunku, tak że otrzymuje się 404

Niezbyt elegancka, ale wydaje się działać. Główny problem polega więc na tym, że utknąłeś z tym generowaniem fałszywych manifestów 404, dopóki wszyscy, którzy kiedykolwiek byli w Twojej witrynie, nie powrócili i nie wyczyścili pamięci podręcznej.

tam ma być lepszy sposób ...

0

To może być stare, ale miejmy nadzieję, że nadal będzie pomocne dla kogoś.

Zobacz nagłówki HTTP we właściwościach IIS. Zobacz, jak włączyć lub wyłączyć wygasanie zawartości. Możliwe, że usługi IIS nadal robią pamięć podręczną.

2

Spróbuj po prostu usunąć plik manifestu.Z dokumentacji mozzila:

Pamięć podręczna aplikacji może również stać się przestarzała. Jeśli manifest zostanie usunięty z serwera, przeglądarka usunie wszystkie pamięci podręczne aplikacji, które używają tego manifestu, a następnie wysyła zdarzenie "przestarzałe" do obiektu pamięci podręcznej aplikacji. Wtedy stan pamięci podręcznej aplikacji jest ustawiony na OBSOLETE.

To również zadziałało dla mnie na chrom.

+0

Jak pamiętam. do celów programistycznych (gdzie trzeba regularnie aktualizować) to rozwiązanie nie pomaga ... lub? – davidtaubmann

1

Jednym rozwiązaniem, jeśli używasz IIS 7, jest usunięcie typu Mime dla pliku .manifest lub .appcache, który został dodany w celu włączenia buforowania. Zawsze możesz dodać to z powrotem, gdy chcesz ponownie włączyć buforowanie. To właśnie zrobiłem, żeby naprawić moje.

1

To, co robimy, to usunąć listę plików w manifeście, więc się wyróżnia. ŻADNY plik nie zostanie zbuforowany.

To działa dla nas.

0

Dla celów rozwojowych (ciągłe zmiany), co zrobiliśmy jest:

  1. Ustaw -cache manifest Plik- pod swoim języku po stronie serwera, na przykład, używamy PHP, więc nasz cache rozwój nazywany jest „cache.manifest.php” i to wskazał ten sam sposób w tagu hTML, takich jak to:

    <html manifest="cache.manifest.php"> 
    
  2. umieścić niektóre -Time dependent- łańcuch (lub coś innego, co cię apartamentów) gdzieś w manifest jako komentarz (# ---), więc plik jest inny co jakiś czas (przeglądarki wydają się porównywać zawartość manifestu, a nie datę), na przykład ten ciąg zmienia manifest co minutę, w ten sposób wszystkie pliki zostaną ponownie zapisane w pamięci podręcznej, jeśli wizyta w ostatniej chwili jest inna.

    <?php if($dev) echo date("Y-m-d H:m"); ?> 
    

Właśnie przetestowane tej procedury przy użyciu Chrome, nadzieję, że to działa na innych, ale jeśli nie wasze komentarze i porady byłyby bardzo dobrze widziane.

Powiązane problemy