На момент написания этого ответа в принятом ответе на этот вопрос, по- видимому, указано, что браузеры не обязаны удалять файл 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 также должен быть немедленно удален. Спецификация не дает браузерам возможности для маневра в этом вопросе; если бы браузер предлагал пользователю возможность отключить истечение срока действия файлов cookie, поскольку принятый ответ предполагает, что некоторые браузеры это делают, то это будет нарушением спецификации. (Такая функция также мало пригодилась бы, и, насколько мне известно, ее нет ни в одном браузере.)
Почему же тогда ОП этого вопроса обнаружил, что этот подход терпит неудачу? Хотя я не очищал копию Internet Explorer от пыли, чтобы проверить его поведение, я подозреваю, что это произошло из-за Expires
неправильного формата значения OP ! Они использовали это значение:
expires=Thu, Jan 01 1970 00:00:00 UTC;
Однако это синтаксически неверно по двум причинам.
Раздел синтаксиса спецификации диктует, что значение Expires
атрибута должно быть
rfc1123 -date, определенный в [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;
тогда это предположительно сработало бы.