2010-12-27 10 views
20

Sembra che una volta che hai una voce di manifesti, a la:Una volta che un documento HTML ha manifest (cache.manifest), come puoi rimuoverlo?

<html manifest="cache.manifest"> 

Poi quella pagina (la voce principale nella cache) sarà sempre memorizzato nella cache (almeno da Safari) fino a quando l'utente non qualcosa da rimuovere la cache, anche se successivamente rimuovi l'attributo manifest dal tag html e aggiorni il manifest (cambiando qualcosa all'interno di esso), forzando la voce principale a essere ricaricata insieme a tutto il resto.

In altre parole, se si dispone di:

  • index.html (con manifesti definito)
  • file1.js (riferimento nel manifesto)
  • file2.js (riferimento nel manifesto)
  • cache.manifest (elenca i due js file)

- rimuovendo la voce manifesta da index.html e la modifica il manifest (quindi viene espulso dal browser e tutto il contenuto ricaricato) non impedirà a questa pagina di comportarsi come se fosse ancora completamente memorizzata nella cache. Se visualizzi l'origine su index.html non vedrai più manifest, ma il browser richiederà comunque solo il file cache.manifest e, a meno che il contenuto di quel file non venga modificato, non verranno mostrate altre modifiche a nessun file utente.

Sembra un bug piuttosto eclatante ed è presente su iOS e sulle versioni Mac di Safari. Qualcuno ha trovato un modo per reimpostare la pagina e liberarsi della cache senza richiedere l'intervento dell'utente?

risposta

17

Ive stata la ricerca la stessa domanda, e doesnt sembrano essere un'API per:

  1. innescare dinamicamente che una pagina viene memorizzata nella cache
  2. causa dinamicamente che una pagina smetta di essere memorizzata nella cache.

Ecco le migliori risorse che ho trovato:

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

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

In particolare, questa citazione dal primo link:

Se il file manifesto o una risorsa specificata non riesce a scaricare, l'intero aggiornamento fallisce. Il browser continuerà a utilizzare la vecchia cache dell'applicazione in caso di un simile errore.

In caso contrario, non è necessario menzionare lo scaricamento della cache.

Sembra suggerire che non si può forzare un errore per farlo annullare. Tuttavia, come indicato di seguito, la specifica suggerisce che se si verifica un errore durante il download del file manifest, l'intera cache verrà rimossa.

in Google Chrome, l'utente può accedere al seguente URL:

chrome://appcache-internals/

e disattivare manualmente la cache. Ovviamente, la volta successiva che visitano la pagina, questa verrà memorizzata se la pagina contiene la proprietà manifest.

Se si guarda la specifica: 5.6 Offline Web applications

E sembra suggerire una situazione in cui viene rimossa la cache. In particolare, la sezione 5.6.4.5:

Se il recupero manifesto fallisce a causa di un 404 o 410 risposta o equivalente, quindi eseguire queste sottofasi: Mark gruppo di cache come obsoleto. Questo gruppo di cache non esiste più per scopi diversi dall'elaborazione di oggetti Documento già associati a una cache dell'applicazione nel gruppo di cache. Se il gruppo cache ha una cache dell'applicazione il cui flag di completezza è incompleto, quindi eliminare la cache dell'applicazione.

Si dice poi:

Se questo fosse un tentativo di cache, cache del gruppo degli scarti del tutto.

In sostanza, se la richiesta del file manifest cache risulta in un 404, l'intera cache deve essere eliminata. Quindi, hai provato a fare in modo che il server restituisca un 404 o un 410 quando viene richiesto il file manifest della cache? Questo dovrebbe funzionare Il trucco è di restituire solo il 404/410 per le pagine da cui vuoi rimuovere il manifest (magari usando i parametri url?).

+4

Il ritorno di un 404 sembra scaricare il gruppo di cache in Chrome. Grazie per la ricerca su questo! Ho provato a restituire un manifest della cache vuota e non scarica le risorse memorizzate nella cache. –

+2

Posso confermare che funziona. Devi ricaricare la tua pagina due volte per vedere il risultato. – Soska

4

Una possibile soluzione:

  • modificare il manifesto (quindi ricaricati)
  • modificare il file master (index.html) per fare riferimento a una manifesta inesistente, quindi diventa un 404

Poco elegante, ma sembra funzionare. Il problema principale è che sei bloccato con questa voce di manifest false che genera 404 fino a quando tutti quelli che sono mai stati sul tuo sito sono tornati e hanno cancellato la cache.

Ci deve essere un modo migliore ...

0

Questo potrebbe essere vecchio ma si spera comunque utile a qualcuno.

Dai un'occhiata alle intestazioni HTTP nelle proprietà IIS. Dai un'occhiata all'abilitazione o alla disattivazione della scadenza del contenuto. Potrebbe essere che IIS stia ancora facendo il cache.

2

Provare a eliminare semplicemente il file manifest.Dai documenti mozzila:

Le cache delle applicazioni possono anche diventare obsolete. Se il manifest viene rimosso dal server, il browser rimuove tutte le cache dell'applicazione che utilizzano manifest, quindi invia un evento "obsoleto" all'oggetto cache dell'applicazione. Quindi lo stato della cache dell'applicazione è impostato su OBSOLETE.

Questo ha funzionato anche su Chrome.

+0

Come posso ricordare. a scopo di sviluppo (dove è necessario aggiornare costantemente le cose) questa soluzione non aiuta ... o? – davidtaubmann

1

Una soluzione, se si utilizza IIS 7 è rimuovere il tipo Mime per il tipo di file .manifest o .appcache aggiunto per abilitare la memorizzazione nella cache. È sempre possibile aggiungere questo indietro quando si desidera abilitare nuovamente la memorizzazione nella cache. Questo è quello che ho fatto per aggiustare il mio.

1

Quello che facciamo è eliminare l'elenco di file nel manifest, quindi spicca che nessun file verrà memorizzato nella cache.

Funziona per noi.

0

per scopi di sviluppo (cambiamenti costanti), ciò che abbiamo fatto è:

  1. impostare un -cache manifesta file- sotto il vostro linguaggio server-side, per esempio, usiamo PHP, quindi il nostro cache di sviluppo si chiama "cache.manifest.php" ed è indicato questo stesso modo nel tag HTML come questo:

    <html manifest="cache.manifest.php"> 
    
  2. Metti un po 'di stringa dependent- -time (o qualcos'altro che si suite) da qualche parte nella tua manifestare come commento (# ---), in modo che il file sia diverso di tanto in tanto (i browser sembrano confrontare il contenuto del manifest, non la data), ad esempio questa stringa cambia il manifest ogni minuto, in questo modo tutti i file verranno ri-memorizzati nella cache se il la visita è in un minuto diverso come l'ultima volta.

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

Abbiamo appena testato questa procedura utilizzando Chrome, spero che funziona in altri, ma se non i vostri commenti e consigli sarebbe molto ben apprezzato.