No momento em que escrevi esta resposta, a resposta aceita para essa pergunta parece indicar que os navegadores não precisam excluir um cookie ao receber um cookie de substituição cujo Expires
valor estava no passado. Essa afirmação é falsa. Definir Expires
como no passado é a maneira padrão e compatível com as especificações de excluir um cookie, e os agentes do usuário são obrigados pelas especificações a respeitá-lo.
O uso de um Expires
atributo no passado para excluir um cookie está correto e é a maneira de remover cookies ditados pelas especificações. A seção de exemplos da RFC 6255 declara:
Por fim, para remover um cookie, o servidor retorna um cabeçalho Set-Cookie com uma data de validade no passado. O servidor terá êxito na remoção do cookie apenas se o atributo Path e Domain no cabeçalho Set-Cookie corresponderem aos valores usados quando o cookie foi criado.
A seção Requisitos do agente do usuário inclui os seguintes requisitos, que juntos têm o efeito de que um cookie deve ser imediatamente eliminado se o agente do usuário receber um novo cookie com o mesmo nome cuja data de validade esteja no passado
Se [ao receber um novo cookie] a loja de cookies contiver um cookie com o mesmo nome, domínio e caminho que o cookie recém-criado:
- ...
- ...
- Atualize o horário de criação do cookie recém-criado para corresponder ao horário de criação do cookie antigo.
- Remova o cookie antigo da loja de cookies.
Insira o cookie recém-criado no armazenamento de cookies.
Um cookie está "expirado" se o cookie tiver uma data de validade no passado.
O agente do usuário DEVE remover todos os cookies expirados da loja de cookies se, a qualquer momento, existir um cookie expirado na loja de cookies.
Os pontos 11-3, 11-4 e 12 acima juntos significam que quando um novo cookie é recebido com o mesmo nome, domínio e caminho, o cookie antigo deve ser eliminado e substituído pelo novo cookie. Por fim, o ponto abaixo sobre cookies expirados determina ainda que, após isso, o novo cookie também deverá ser despejado imediatamente. A especificação não oferece espaço de manobra para os navegadores neste ponto; se um navegador oferecer ao usuário a opção de desativar a expiração de cookies, como a resposta aceita sugere que alguns navegadores o façam, isso viola as especificações. (Esse recurso também teria pouco uso e, tanto quanto eu sei, ele não existe em nenhum navegador.)
Por que, então, o OP desta pergunta observou essa abordagem falhando? Embora eu não tenha espanado uma cópia do Internet Explorer para verificar seu comportamento, suspeito que tenha sido porque o Expires
valor do OP estava malformado! Eles usaram este valor:
expires=Thu, Jan 01 1970 00:00:00 UTC;
No entanto, isso é sintaticamente inválido de duas maneiras.
A seção de sintaxe da especificação determina que o valor do Expires
atributo deve ser um
rfc1123 -date, definido em [RFC2616], Seção 3.3.1
Seguindo o segundo link acima, encontramos isso como um exemplo do formato:
Sun, 06 Nov 1994 08:49:37 GMT
e descobrir que a definição de sintaxe ...
exige que as datas sejam escritas no formato dia mês ano , não no formato mês dia ano , conforme usado pelo solicitante da pergunta.
Especificamente, ele define da rfc1123-date
seguinte maneira:
rfc1123-date = wkday "," SP date1 SP time SP "GMT"
e define date1
assim:
date1 = 2DIGIT SP month SP 4DIGIT
; day month year (e.g., 02 Jun 1982)
e
não permite UTC
como fuso horário.
A especificação contém a seguinte declaração sobre quais compensações de fuso horário são aceitáveis nesse formato:
Todos os carimbos de data / hora HTTP DEVEM ser representados no horário médio de Greenwich (GMT), sem exceção.
Além disso, se aprofundarmos nas especificações originais desse formato de data e hora, descobrimos que em suas especificações iniciais em https://tools.ietf.org/html/rfc822 , a seção Sintaxe lista "UT" (que significa "tempo universal" ) como um valor possível, mas não lista o UTC (Tempo Universal Coordenado) como válido. Até onde eu sei, o uso de "UTC" neste formato de data nunca foi válido; não era um valor válido quando o formato foi especificado pela primeira vez em 1982, e a especificação HTTP adotou uma versão estritamente mais restritiva do formato ao proibir o uso de todos os valores de "zona" que não sejam "GMT".
Se o autor da pergunta aqui tiver usado um Expires
atributo como este , então:
expires=Thu, 01 Jan 1970 00:00:00 GMT;
então, presumivelmente, teria funcionado.