Tại thời điểm tôi viết câu trả lời này, câu trả lời được chấp nhận cho câu hỏi này dường như nói rằng các trình duyệt không bắt buộc phải xóa cookie khi nhận được cookie thay thế có Expires
giá trị trong quá khứ. Yêu cầu đó là sai. Thiết lập Expires
trước đây là cách xóa tiêu chuẩn, tuân thủ thông số kỹ thuật và các tác nhân người dùng được yêu cầu bởi thông số kỹ thuật để tôn trọng nó.
Sử dụng một Expires
thuộc tính trong quá khứ để xóa cookie là chính xác và là cách để loại bỏ cookie được quy định bởi thông số kỹ thuật. Phần ví dụ của RFC 6255 nêu rõ:
Cuối cùng, để xóa cookie, máy chủ trả về tiêu đề Set-Cookie có ngày hết hạn trong quá khứ. Máy chủ sẽ thành công trong việc xóa cookie chỉ khi thuộc tính Đường dẫn và Tên miền trong tiêu đề Set-Cookie khớp với các giá trị được sử dụng khi cookie được tạo.
Phần Yêu cầu Tác nhân Người dùng bao gồm các yêu cầu sau, cùng với đó có tác dụng là cookie phải hết hạn ngay lập tức nếu tác nhân người dùng nhận được cookie mới có cùng tên đã hết hạn sử dụng
Nếu [khi nhận cookie mới], cửa hàng cookie chứa cookie có cùng tên, tên miền và đường dẫn với cookie mới được tạo:
- ...
- ...
- Cập nhật thời gian tạo của cookie mới tạo để khớp với thời gian tạo của cookie cũ.
- Loại bỏ cookie cũ khỏi cửa hàng cookie.
Chèn cookie vừa tạo vào cửa hàng cookie.
Một cookie đã "hết hạn" nếu cookie có thời hạn sử dụng trong quá khứ.
Tác nhân người dùng PHẢI đuổi tất cả các cookie đã hết hạn khỏi cửa hàng cookie nếu bất cứ lúc nào, một cookie hết hạn tồn tại trong cửa hàng cookie.
Các điểm 11-3, 11-4 và 12 ở trên cùng có nghĩa là khi nhận được cookie mới có cùng tên, tên miền và đường dẫn, cookie cũ phải được hết hạn và thay thế bằng cookie mới. Cuối cùng, điểm dưới đây về cookie hết hạn cho biết thêm rằng sau khi hoàn thành, cookie mới cũng phải bị đuổi ngay lập tức. Thông số kỹ thuật không cung cấp phòng lắc cho các trình duyệt vào thời điểm này; nếu một trình duyệt cung cấp cho người dùng tùy chọn vô hiệu hóa hết hạn cookie, vì câu trả lời được chấp nhận cho thấy một số trình duyệt thực hiện, thì nó sẽ vi phạm thông số kỹ thuật. (Một tính năng như vậy cũng sẽ có ít sử dụng và theo như tôi biết thì nó không tồn tại trong bất kỳ trình duyệt nào.)
Tại sao, sau đó, OP của câu hỏi này quan sát cách tiếp cận này không thành công? Mặc dù tôi đã không bỏ qua một bản sao của Internet Explorer để kiểm tra hành vi của nó, tôi nghi ngờ đó là vì Expires
giá trị của OP không đúng! Họ đã sử dụng giá trị này:
expires=Thu, Jan 01 1970 00:00:00 UTC;
Tuy nhiên, điều này là không hợp lệ về mặt cú pháp theo hai cách.
Phần cú pháp của spec quy định rằng giá trị của Expires
thuộc tính phải là một
rfc1123 -date , được định nghĩa trong [RFC2616], Mục 3.3.1
Theo liên kết thứ hai ở trên, chúng tôi thấy đây là một ví dụ về định dạng:
Sun, 06 Nov 1994 08:49:37 GMT
và thấy rằng định nghĩa cú pháp ...
yêu cầu ngày được viết theo định dạng ngày tháng năm , không phải định dạng tháng tháng năm như người hỏi đặt ra.
Cụ thể, nó định nghĩa rfc1123-date
như sau:
rfc1123-date = wkday "," SP date1 SP time SP "GMT"
và định nghĩa date1
như thế này:
date1 = 2DIGIT SP month SP 4DIGIT
; day month year (e.g., 02 Jun 1982)
và
không cho phép UTC
như một múi giờ.
Thông số kỹ thuật có chứa tuyên bố sau về độ lệch múi giờ được chấp nhận trong định dạng này:
Tất cả tem ngày / giờ HTTP PHẢI được thể hiện bằng Giờ chuẩn Greenwich (GMT), không có ngoại lệ.
Còn gì nữa nếu chúng ta tìm hiểu sâu hơn về thông số ban đầu của định dạng datetime này, chúng ta thấy rằng trong thông số ban đầu của nó trong https://tools.ietf.org/html/rfc822 , phần Syntax liệt kê "UT" (có nghĩa là "thời gian phổ quát" ) là một giá trị có thể, nhưng không liệt kê không phải UTC (Giờ phối hợp quốc tế) là hợp lệ. Theo tôi biết, sử dụng "UTC" ở định dạng ngày này chưa bao giờ hợp lệ; nó không phải là một giá trị hợp lệ khi định dạng được chỉ định lần đầu tiên vào năm 1982 và thông số HTTP đã áp dụng một phiên bản hạn chế nghiêm ngặt hơn của định dạng bằng cách cấm sử dụng tất cả các giá trị "vùng" khác với "GMT".
Nếu người hỏi câu hỏi ở đây đã sử dụng một Expires
thuộc tính như thế này , thì:
expires=Thu, 01 Jan 1970 00:00:00 GMT;
sau đó nó có lẽ đã làm việc