ในขณะที่ฉันเขียนคำตอบนี้คำตอบที่ยอมรับสำหรับคำถามนี้จะปรากฏขึ้นเพื่อระบุว่าเบราว์เซอร์ไม่จำเป็นต้องลบคุกกี้เมื่อได้รับคุกกี้ทดแทนซึ่งมีExpires
ค่าในอดีต การอ้างสิทธิ์นั้นเป็นเท็จ การตั้งค่าที่Expires
จะเป็นในอดีตคือวิธีมาตรฐานในการลบคุกกี้และเอเจนต์ผู้ใช้จำเป็นต้องมีเพื่อเคารพมัน
การใช้Expires
คุณลักษณะในอดีตเพื่อลบคุกกี้นั้นถูกต้องและเป็นวิธีการลบคุกกี้ที่บอกโดยข้อกำหนด ส่วนตัวอย่างของRFC 6255สถานะ:
ในที่สุดหากต้องการลบคุกกี้เซิร์ฟเวอร์จะส่งคืนส่วนหัว Set-Cookie พร้อมวันหมดอายุในอดีต เซิร์ฟเวอร์จะประสบความสำเร็จในการลบคุกกี้เฉพาะเมื่อเส้นทางและแอตทริบิวต์ของโดเมนในส่วนหัว Set-Cookie ตรงกับค่าที่ใช้เมื่อสร้างคุกกี้
ผู้ใช้ต้องการตัวแทนส่วนรวมถึงข้อกำหนดต่อไปนี้ซึ่งร่วมกันมีผลกระทบที่คุกกี้จะต้องถูกลบออกทันทีหากตัวแทนผู้ใช้จะได้รับคุกกี้ใหม่ที่มีชื่อเดียวกันที่มีวันหมดอายุอยู่ในอดีตที่ผ่านมา
หาก [เมื่อได้รับคุกกี้ใหม่] ที่เก็บคุกกี้มีคุกกี้ที่มีชื่อโดเมนและเส้นทางเหมือนกันกับคุกกี้ที่สร้างขึ้นใหม่:
- ...
- ...
- อัปเดตเวลาสร้างของคุกกี้ที่สร้างขึ้นใหม่เพื่อให้ตรงกับเวลาสร้างของคุกกี้เก่า
- ลบคุกกี้เก่าออกจากที่เก็บคุกกี้
แทรกคุกกี้ที่สร้างขึ้นใหม่ลงในที่เก็บคุกกี้
คุกกี้คือ "หมดอายุ" หากคุกกี้มีวันหมดอายุในอดีต
ตัวแทนผู้ใช้จะต้องขับไล่คุกกี้ที่หมดอายุทั้งหมดจากที่เก็บคุกกี้หากมีคุกกี้ที่หมดอายุในเวลาใดก็ได้
จุดที่ 11-3, 11-4 และ 12 ข้างต้นเข้าด้วยกันหมายความว่าเมื่อได้รับคุกกี้ใหม่ที่มีชื่อโดเมนและเส้นทางเดียวกันคุกกี้เก่าจะต้องถูกลบล้างและแทนที่ด้วยคุกกี้ใหม่ สุดท้ายจุดด้านล่างเกี่ยวกับคุกกี้ที่หมดอายุคำสั่งต่อไปว่าหลังจากที่เสร็จสิ้นการใหม่คุกกี้ต้องยังถูกขับไล่ทันที ข้อมูลจำเพาะไม่มีห้องกระดิกให้กับเบราว์เซอร์ในจุดนี้ หากเบราว์เซอร์ให้ผู้ใช้มีตัวเลือกในการปิดการใช้งานการหมดอายุของคุกกี้เนื่องจากคำตอบที่ได้รับการยอมรับแสดงให้เห็นว่าเบราว์เซอร์บางตัวทำเช่นนั้นจะเป็นการละเมิดข้อกำหนด (คุณสมบัติดังกล่าวจะมีประโยชน์น้อยและเท่าที่ฉันรู้ว่ามันไม่มีอยู่ในเบราว์เซอร์ใด ๆ )
เหตุใด OP ของคำถามนี้จึงสังเกตวิธีการนี้ล้มเหลว แม้ว่าฉันจะไม่ได้ปัดฝุ่นสำเนาของ Internet Explorer เพื่อตรวจสอบพฤติกรรมของมัน แต่ฉันคิดว่ามันเป็นเพราะExpires
ค่าของ OP ผิดรูปแบบ! พวกเขาใช้ค่านี้:
expires=Thu, Jan 01 1970 00:00:00 UTC;
อย่างไรก็ตามสิ่งนี้ไม่ถูกต้องทางไวยากรณ์ในสองวิธี
ส่วนไวยากรณ์ของคำสั่งสเปคที่คุ้มค่าของExpires
แอตทริบิวต์จะต้องเป็น
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 ทั้งหมดต้องแสดงใน Greenwich Mean Time (GMT) โดยไม่มีข้อยกเว้น
มีอะไรมากกว่าถ้าเราขุดลึกลงไปในสเปคเดิมของรูปแบบวันที่และเวลานี้เราพบว่าในสเปคครั้งแรกในhttps://tools.ietf.org/html/rfc822ที่ไวยากรณ์ส่วนรายการ "ยูทาห์" (หมายถึง "เวลามาตรฐานสากล" ) เป็นค่าที่เป็นไปได้ แต่ไม่แสดงรายการ UTC (เวลาสากลเชิงพิกัด) ที่ถูกต้อง เท่าที่ฉันรู้การใช้ "UTC" ในรูปแบบวันที่นี้ไม่เคยถูกต้อง มันไม่ใช่ค่าที่ถูกต้องเมื่อมีการระบุรูปแบบครั้งแรกในปี 1982 และข้อมูลจำเพาะ HTTP ได้นำรูปแบบที่เข้มงวดมากขึ้นมาใช้โดยห้ามการใช้ค่า "โซน" ทั้งหมดนอกเหนือจาก "GMT"
หากผู้ถามคำถามที่นี่ใช้Expires
แอตทริบิวต์เช่นนี้แทน:
expires=Thu, 01 Jan 1970 00:00:00 GMT;
ถ้าอย่างนั้นมันก็น่าจะใช้ได้