Al momento in cui scrivo questa risposta, la risposta accettata a questa domanda sembra affermare che i browser non sono tenuti ad eliminare un cookie quando ricevono un cookie sostitutivo il cui Expires
valore è in passato. Tale affermazione è falsa. L'impostazione Expires
di essere in passato è il modo standard e conforme alle specifiche di eliminare un cookie e gli agenti utente sono tenuti dalle specifiche a rispettarlo.
L'uso di un Expires
attributo in passato per eliminare un cookie è corretto ed è il modo per rimuovere i cookie dettati dalle specifiche. La sezione degli esempi di RFC 6255 afferma:
Infine, per rimuovere un cookie, il server restituisce un'intestazione Set-Cookie con una data di scadenza nel passato. Il server riuscirà a rimuovere il cookie solo se l'attributo Path e Domain nell'intestazione Set-Cookie corrispondono ai valori utilizzati al momento della creazione del cookie.
La sezione Requisiti agente utente include i seguenti requisiti, che insieme hanno l'effetto di eliminare immediatamente un cookie se l'agente utente riceve un nuovo cookie con lo stesso nome la cui data di scadenza è passata
Se [quando riceve un nuovo cookie] l'archivio cookie contiene un cookie con lo stesso nome, dominio e percorso del cookie appena creato:
- ...
- ...
- Aggiorna l'ora di creazione del cookie appena creato in modo che corrisponda all'ora di creazione del cookie precedente.
- Rimuovi il vecchio cookie dal cookie store.
Inserisci il cookie appena creato nel cookie store.
Un cookie è "scaduto" se il cookie ha una data di scadenza in passato.
L'agente utente DEVE eliminare tutti i cookie scaduti dal negozio di cookie se, in qualsiasi momento, esiste un cookie scaduto nel negozio di cookie.
I punti 11-3, 11-4 e 12 sopra indicano che quando un nuovo cookie viene ricevuto con lo stesso nome, dominio e percorso, il vecchio cookie deve essere espulso e sostituito con il nuovo cookie. Infine, il punto di sotto di circa cookie scaduti ulteriori dettami che, dopo che è fatto, il nuovo biscotto deve anche essere immediatamente sfrattato. Le specifiche non offrono spazio di manovra ai browser su questo punto; se un browser offrisse all'utente la possibilità di disabilitare la scadenza dei cookie, come suggerisce la risposta accettata da alcuni browser, ciò violerebbe le specifiche. (Una funzione del genere sarebbe inoltre poco utile e, per quanto ne so, non esiste in nessun browser.)
Perché, quindi, l'OP di questa domanda ha riscontrato un fallimento di questo approccio? Anche se non ho rispolverato una copia di Internet Explorer per verificarne il comportamento, sospetto che ciò sia dovuto al fatto che il Expires
valore del PO non era corretto! Hanno usato questo valore:
expires=Thu, Jan 01 1970 00:00:00 UTC;
Tuttavia, questo è sintatticamente non valido in due modi.
La sezione della sintassi della specifica indica che il valore Expires
dell'attributo deve essere a
rfc1123 -date, definito in [RFC2616], Sezione 3.3.1
Seguendo il secondo link sopra, troviamo questo dato come esempio del formato:
Sun, 06 Nov 1994 08:49:37 GMT
e scopri che la definizione della sintassi ...
richiede che le date siano scritte nel formato giorno mese anno , non nel formato anno mese giorno utilizzato dall'interrogatore della domanda.
In particolare, definisce rfc1123-date
come segue:
rfc1123-date = wkday "," SP date1 SP time SP "GMT"
e definisce date1
così:
date1 = 2DIGIT SP month SP 4DIGIT
; day month year (e.g., 02 Jun 1982)
e
non consente UTC
come fuso orario.
La specifica contiene la seguente dichiarazione su quali offset del fuso orario sono accettabili in questo formato:
Tutti i timbri data / ora HTTP DEVONO essere rappresentati in GMT (Greenwich Mean Time), senza eccezioni.
Inoltre, se approfondiamo le specifiche originali di questo formato datetime, scopriamo che nelle specifiche iniziali in https://tools.ietf.org/html/rfc822 , la sezione Sintassi elenca "UT" (che significa "tempo universale" ) come valore possibile, ma non elenca UTC (Coordinated Universal Time) come valido. Per quanto ne so, l'uso di "UTC" in questo formato data non è mai stato valido; non era un valore valido quando il formato è stato specificato per la prima volta nel 1982 e le specifiche HTTP hanno adottato una versione strettamente più restrittiva del formato vietando l'uso di tutti i valori "zone" diversi da "GMT".
Se la domanda qui posta aveva invece usato un Expires
attributo come questo , allora:
expires=Thu, 01 Jan 1970 00:00:00 GMT;
quindi avrebbe presumibilmente funzionato.