На момент написання цієї відповіді у прийнятій відповіді на це запитання з'являється повідомлення про те, що веб-переглядачам не потрібно видаляти файли cookie при отриманні замінного файлу cookie, Expires
значення якого було раніше. Це твердження хибне. НалаштуванняExpires
в минулому - це стандартний, специфічно сумісний спосіб видалення файлу cookie, а користувальницькі агенти вимагають, щоб специфікація поважала його.
Використання Expires
атрибута в минулому для видалення файлу cookie є правильним і є способом видалення файлів cookie, продиктованих специфікацією. У розділі прикладів RFC 6255 зазначено:
Нарешті, щоб видалити файл cookie, сервер повертає заголовок Set-Cookie з датою закінчення терміну дії. Сервер буде успішним у видаленні файлу cookie лише у тому випадку, якщо атрибут Path та Domain у заголовку Set-Cookie збігаються зі значеннями, використаними під час створення файлу cookie.
Розділ " Вимоги до користувацького агента " включає наступні вимоги, які в сукупності означають, що файл cookie повинен бути негайно видалений, якщо користувальницький агент отримає нове печиво з тим самим іменем, термін дії якого минув раніше
Якщо [при отриманні нового файлу cookie] у магазині файлів cookie міститься файл cookie з тим самим іменем, доменом і шляхом, як і нещодавно створений файл cookie:
- ...
- ...
- Оновіть час створення новоствореного файлу cookie, щоб він відповідав часу створення старого файлу cookie.
- Видаліть старий файл cookie з магазину cookie.
Вставте новостворене печиво у магазин файлів cookie.
Файл cookie "закінчився", якщо у нього раніше закінчився термін придатності.
Агент користувача ОБОВ'ЯЗКОВО вилучити всі файли cookie з минулим терміном зберігання, якщо в будь-який час у магазині файлів cookie існує файл cookie, що закінчився.
Точки 11-3, 11-4 та 12 вище разом означають, що коли отримується новий файл cookie з тим самим іменем, доменом і шляхом, старий файл cookie повинен бути замінений на новий і його замінити. Нарешті, нижченаведений пункт про закінчені терміни cookie ще більше наказує, що після цього новий файл cookie також повинен бути негайно вилучений. Спеціалізація не пропонує в цьому веб-переглядачі відмінювати приміщення; якби браузер запропонував користувачеві можливість вимкнути термін дії файлів cookie, як прийнята відповідь пропонує деяким браузерам, це було б порушенням специфікації. (Така функція також мала б користь, і наскільки я знаю, її немає в жодному браузері.)
Чому тоді ОП з цього питання бачила цей підхід невдало? Хоча я і не видалив копію Internet Explorer, щоб перевірити її поведінку, я підозрюю, що це було через те, що Expires
значення ОП було неправильним! Вони використали це значення:
expires=Thu, Jan 01 1970 00:00:00 UTC;
Однак це синтаксично недійсно двома способами.
Розділ синтаксису специфікації диктує, що значення Expires
атрибута має бути a
rfc1123-дата , визначена в [RFC2616], розділ 3.3.1
Переглядаючи друге посилання вище, ми знаходимо це, наведене як приклад формату:
Sun, 06 Nov 1994 08:49:37 GMT
і виявимо, що визначення синтаксису ...
вимагає , щоб терміни записати в місяць рік форматі, а НЕ місяць день рік формат, який використовується в питання запитувача.
Зокрема, він визначає rfc1123-date
наступне:
rfc1123-date = wkday "," SP date1 SP time SP "GMT"
і визначає date1
так:
date1 = 2DIGIT SP month SP 4DIGIT
; day month year (e.g., 02 Jun 1982)
і
не дозволяє UTC
як часовий пояс.
Специфікація містить таке твердження про те, які зрушення часового поясу прийнятні в такому форматі:
Усі позначки дати та часу HTTP ОБОВ'ЯЗКОВО бути представлені у Грінвічському середньому часі (GMT), без винятку.
Більш того , якщо ми заглибимося в оригінальній специфікації цього формату дати і часу, ми знаходимо , що у своїй первісній специфікації в https://tools.ietf.org/html/rfc822 , то Синтаксис розділу списки «UT» (тобто «універсальне час» ) як можливе значення, але не вказано не дійсним UTC (координований універсальний час). Наскільки мені відомо, використання "UTC" у такому форматі дати ніколи не було дійсним; це не було дійсним значенням, коли формат був вперше вказаний у 1982 році, і специфікація HTTP прийняла суворо більш обмежувальну версію формату, заборонивши використовувати всі значення "зони", крім "GMT".
Якщо питання Аскер тут замість цього використовував Expires
атрибут , як це , то:
expires=Thu, 01 Jan 1970 00:00:00 GMT;
то, мабуть, це спрацювало б.