Zum Zeitpunkt des Schreibens dieser Antwort scheint die akzeptierte Antwort auf diese Frage zu besagen, dass Browser kein Cookie löschen müssen, wenn sie ein Ersatz-Cookie erhalten, dessen Expires
Wert in der Vergangenheit liegt. Diese Behauptung ist falsch. Die Einstellung Expires
, in der Vergangenheit zu sein, ist die standardmäßige, spezifikationskonforme Methode zum Löschen eines Cookies. Benutzeragenten müssen diese spezifizieren.
Die Verwendung eines Expires
Attributs in der Vergangenheit zum Löschen eines Cookies ist korrekt und dient zum Entfernen von Cookies, die von der Spezifikation vorgegeben werden. Im Beispielabschnitt von RFC 6255 heißt es:
Um ein Cookie zu entfernen, gibt der Server einen Set-Cookie-Header mit einem Ablaufdatum in der Vergangenheit zurück. Der Server kann das Cookie nur dann erfolgreich entfernen, wenn der Pfad und das Domain-Attribut im Set-Cookie-Header mit den Werten übereinstimmen, die beim Erstellen des Cookies verwendet wurden.
Der Abschnitt Anforderungen an Benutzeragenten enthält die folgenden Anforderungen, die zusammen dazu führen, dass ein Cookie sofort gelöscht werden muss, wenn der Benutzeragent ein neues Cookie mit demselben Namen erhält, dessen Ablaufdatum in der Vergangenheit liegt
Wenn [beim Empfang eines neuen Cookies] der Cookie-Speicher ein Cookie mit demselben Namen, derselben Domäne und demselben Pfad wie das neu erstellte Cookie enthält:
- ...
- ...
- Aktualisieren Sie die Erstellungszeit des neu erstellten Cookies so, dass sie mit der Erstellungszeit des alten Cookies übereinstimmt.
- Entfernen Sie den alten Keks aus dem Keksladen.
Fügen Sie das neu erstellte Cookie in den Cookie-Store ein.
Ein Cookie ist "abgelaufen", wenn das Cookie in der Vergangenheit ein Ablaufdatum hat.
Der Benutzeragent MUSS alle abgelaufenen Cookies aus dem Cookie-Speicher entfernen, wenn zu irgendeinem Zeitpunkt ein abgelaufenes Cookie im Cookie-Speicher vorhanden ist.
Die obigen Punkte 11-3, 11-4 und 12 bedeuten zusammen, dass beim Empfang eines neuen Cookies mit demselben Namen, derselben Domäne und demselben Pfad das alte Cookie gelöscht und durch das neue Cookie ersetzt werden muss. Schließlich schreibt der folgende Punkt über abgelaufene Cookies weiter vor, dass das neue Cookie danach auch sofort gelöscht werden muss. Die Spezifikation bietet Browsern in diesem Punkt keinen Spielraum. Wenn ein Browser dem Benutzer die Option bietet, den Ablauf von Cookies zu deaktivieren, wie aus der akzeptierten Antwort hervorgeht, dass dies bei einigen Browsern der Fall ist, verstößt dies gegen die Spezifikation. (Eine solche Funktion hätte auch wenig Sinn und ist meines Wissens in keinem Browser vorhanden.)
Warum hat das OP dieser Frage dann beobachtet, dass dieser Ansatz fehlgeschlagen ist? Obwohl ich eine Kopie von Internet Explorer nicht abgestaubt habe, um das Verhalten zu überprüfen, vermute ich, dass dies daran lag, dass der Expires
Wert des OP fehlerhaft war! Sie haben diesen Wert verwendet:
expires=Thu, Jan 01 1970 00:00:00 UTC;
Dies ist jedoch in zweierlei Hinsicht syntaktisch ungültig.
Der Syntaxabschnitt der Spezifikation schreibt vor, dass der Wert des Expires
Attributs a sein muss
rfc1123 -date, definiert in [RFC2616], Abschnitt 3.3.1
Nach dem zweiten Link oben finden wir dies als Beispiel für das Format:
Sun, 06 Nov 1994 08:49:37 GMT
und finde, dass die Syntaxdefinition ...
erfordert, dass die Daten im Format Tag Monat Jahr geschrieben werden, nicht im Format Monat Tag Jahr Jahr , wie es vom Fragesteller verwendet wird.
Insbesondere definiert es rfc1123-date
wie folgt:
rfc1123-date = wkday "," SP date1 SP time SP "GMT"
und definiert date1
wie folgt:
date1 = 2DIGIT SP month SP 4DIGIT
; day month year (e.g., 02 Jun 1982)
und
erlaubt nicht UTC
als Zeitzone.
Die Spezifikation enthält die folgende Aussage darüber, welche Zeitzonenversätze in diesem Format zulässig sind:
Alle HTTP-Datums- / Zeitstempel MÜSSEN ausnahmslos in Greenwich Mean Time (GMT) dargestellt werden.
Wenn wir uns eingehender mit der ursprünglichen Spezifikation dieses Datetime-Formats befassen, stellen wir fest, dass in der ursprünglichen Spezifikation unter https://tools.ietf.org/html/rfc822 im Abschnitt Syntax "UT" (was "Universalzeit" bedeutet) aufgeführt ist. ) als möglicher Wert, listet jedoch nicht UTC (Coordinated Universal Time) als gültig auf. Soweit ich weiß, war die Verwendung von "UTC" in diesem Datumsformat nie gültig. es war kein gültiger Wert , wenn das Format erst im Jahr 1982 festgelegt wurde, und die HTTP - Spezifikation hat eine streng angenommen mehr restriktive Version des Formats durch das Verbot der Verwendung alles „Zone“ anderer Werte als „GMT“.
Wenn der Fragesteller hier stattdessen ein Expires
Attribut wie dieses verwendet hat , dann:
expires=Thu, 01 Jan 1970 00:00:00 GMT;
dann hätte es vermutlich geklappt.