W chwili, gdy piszę tę odpowiedź, przyjęta odpowiedź na to pytanie wydaje się wskazywać, że przeglądarki nie muszą usuwać pliku cookie w przypadku otrzymania zastępczego pliku cookie, którego Expires
wartość należy do przeszłości. To twierdzenie jest fałszywe. Ustawienie Expires
na przeszłość to standardowy, zgodny ze specyfikacją sposób usuwania pliku cookie, a oprogramowanie użytkownika jest wymagane przez specyfikację, aby go przestrzegać.
Używanie Expires
atrybutu w przeszłości do usuwania pliku cookie jest poprawne i jest sposobem usuwania plików cookie podyktowanym przez specyfikację. W sekcji przykładów dokumentu RFC 6255 podano :
Na koniec, aby usunąć plik cookie, serwer zwraca nagłówek Set-Cookie z datą wygaśnięcia w przeszłości. Serwer pomyślnie usunie plik cookie tylko wtedy, gdy ścieżka i atrybut domeny w nagłówku Set-Cookie są zgodne z wartościami używanymi podczas tworzenia pliku cookie.
Sekcja Wymagania klienta użytkownika zawiera następujące wymagania, które łącznie powodują, że plik cookie musi zostać natychmiast usunięty, jeśli agent użytkownika otrzyma nowy plik cookie o tej samej nazwie, którego data ważności już minęła
Jeśli [podczas otrzymywania nowego pliku cookie] magazyn plików cookie zawiera plik cookie o tej samej nazwie, domenie i ścieżce, co nowo utworzony plik cookie:
- ...
- ...
- Zaktualizuj czas utworzenia nowo utworzonego pliku cookie, aby odpowiadał czasowi utworzenia starego pliku cookie.
- Usuń stare pliki cookie ze sklepu plików cookie.
Wstaw nowo utworzony plik cookie do magazynu plików cookie.
Plik cookie „wygasł”, jeśli ma datę ważności w przeszłości.
Klient użytkownika MUSI usunąć wszystkie wygasłe pliki cookie z magazynu plików cookie, jeśli w dowolnym momencie wygasły plik cookie znajduje się w magazynie plików cookie.
Punkty 11-3, 11-4 i 12 powyżej razem oznaczają, że po otrzymaniu nowego pliku cookie o tej samej nazwie, domenie i ścieżce stary plik cookie musi zostać usunięty i zastąpiony nowym. Wreszcie poniższy punkt dotyczący wygasłych plików cookie dodatkowo mówi, że po wykonaniu tej czynności nowy plik cookie również musi zostać natychmiast usunięty. Specyfikacja nie daje w tej kwestii żadnego miejsca dla przeglądarek; gdyby przeglądarka oferowała użytkownikowi opcję wyłączenia wygaśnięcia plików cookie, jak sugeruje to akceptowana odpowiedź w niektórych przeglądarkach, byłoby to niezgodne ze specyfikacją. (Taka funkcja również byłaby mało przydatna i o ile wiem, nie istnieje w żadnej przeglądarce).
Dlaczego więc w PO w tym pytaniu stwierdzono, że podejście to zawodziło? Chociaż nie odkurzyłem kopii Internet Explorera, aby sprawdzić jego zachowanie, podejrzewam, że było to spowodowane Expires
nieprawidłowym sformułowaniem wartości OP ! Użyli tej wartości:
expires=Thu, Jan 01 1970 00:00:00 UTC;
Jednak jest to niepoprawne składniowo z dwóch powodów.
Sekcja składni specyfikacji mówi, że wartością Expires
atrybutu musi być
rfc1123 -date , zdefiniowana w [RFC2616], Sekcja 3.3.1
Podążając za drugim linkiem powyżej, znajdujemy to jako przykład formatu:
Sun, 06 Nov 1994 08:49:37 GMT
i przekonaj się, że definicja składni ...
wymaga, aby daty były zapisywane w formacie dzień miesiąc rok , a nie miesiąc dzień rok , jak jest to używane przez osobę zadającą pytania.
W szczególności definiuje rfc1123-date
w następujący sposób:
rfc1123-date = wkday "," SP date1 SP time SP "GMT"
i definiuje w date1
ten sposób:
date1 = 2DIGIT SP month SP 4DIGIT
; day month year (e.g., 02 Jun 1982)
i
nie zezwala UTC
jako strefa czasowa.
Specyfikacja zawiera następujące stwierdzenie o tym, jakie przesunięcia stref czasowych są dopuszczalne w tym formacie:
Wszystkie znaczniki daty / czasu HTTP MUSZĄ być przedstawione w czasie Greenwich (GMT), bez wyjątku.
Co więcej, jeśli będziemy kopać głębiej w oryginalnej specyfikacji tego formatu datetime, okazuje się, że w jego początkowej specyfikacji w https://tools.ietf.org/html/rfc822 , że sekcja składni listy „UT” (czyli „czas uniwersalny” ) jako możliwej wartości, ale robi nie lista UTC (Coordinated Universal Time) jako ważny. O ile wiem, używanie „UTC” w tym formacie daty nigdy nie było ważne; nie była to prawidłowa wartość, kiedy format został po raz pierwszy określony w 1982 r., a specyfikacja HTTP przyjęła bardziej restrykcyjną wersję formatu, zakazując stosowania wszystkich wartości „strefy” innych niż „GMT”.
Jeżeli Pytający pytanie tutaj miał zamiast użył Expires
atrybutu jak to , a następnie:
expires=Thu, 01 Jan 1970 00:00:00 GMT;
to przypuszczalnie by zadziałało.