หากต้องการตอบคำถามของคุณเกี่ยวกับสาเหตุที่แคชทำงานแม้ว่าเว็บเซิร์ฟเวอร์จะไม่รวมส่วนหัว:
- หมดอายุ:
[a date]
- การควบคุมแคช: max-age =
[seconds]
เซิร์ฟเวอร์กรุณาขอให้ผู้รับมอบอำนาจกลางรายใดไม่แคชเนื้อหา (เช่นควรเก็บรายการไว้ในแคชส่วนตัวเท่านั้นเช่นในเครื่องของคุณเท่านั้น):
แต่เซิร์ฟเวอร์ลืมที่จะรวมคำแนะนำแคชใด ๆ :
- พวกเขาลืมที่จะรวมหมดอายุดังนั้นเบราว์เซอร์รู้ว่าจะใช้สำเนาแคชจนถึงวันที่
- พวกเขาลืมที่จะรวมMax-Ageดังนั้นเบราว์เซอร์จึงรู้ว่ารายการแคชนั้นนานแค่ไหน
- พวกเขาลืมที่จะรวมE-Tagดังนั้นเบราว์เซอร์สามารถดำเนินการตามเงื่อนไข
แต่พวกเขารวมถึง วันที่แก้ไขครั้งสุดท้ายในการตอบสนอง:
Last-Modified: Tue, 16 Oct 2012 03:13:38 GMT
เนื่องจากเบราว์เซอร์รู้วันที่ที่ไฟล์ถูกแก้ไขจึงสามารถดำเนินการตามเงื่อนไขได้ มันจะถามเซิร์ฟเวอร์สำหรับไฟล์ แต่สั่งให้เซิร์ฟเวอร์ส่งไฟล์เท่านั้นหากไฟล์นั้นถูกแก้ไขตั้งแต่ 2012/10/16 3:13:38:
GET / HTTP/1.1
If-Modified-Since: Tue, 16 Oct 2012 03:13:38 GMT
เซิร์ฟเวอร์ได้รับคำขอตระหนักว่าลูกค้ามีเวอร์ชันล่าสุดอยู่แล้ว แทนที่จะส่งลูกค้า200 OK
ตามด้วยเนื้อหาของหน้าเว็บแทนมันจะบอกคุณว่าเวอร์ชันแคชของคุณดี:
304 Not Modified
เบราว์เซอร์ของคุณต้องประสบความล่าช้าในการส่งคำขอไปยังเซิร์ฟเวอร์และรอการตอบกลับ แต่ก็ไม่จำเป็นต้องดาวน์โหลดเนื้อหาสแตติกอีกครั้ง
ทำไมMax-อายุ ? ทำไมถึงตาย ?
เนื่องจากLast-Modified sucks
ไม่ใช่ทุกอย่างบนเซิร์ฟเวอร์ที่มีวันที่เชื่อมโยงอยู่ ถ้าฉันสร้างหน้าเกี่ยวกับการบินที่มีวันที่ไม่เกี่ยวข้องกับมัน - มันในขณะนี้ แต่ฉันยินดีอย่างยิ่งที่จะให้ผู้ใช้แคชโฮมเพจเป็นเวลา 15 วินาที:
200 OK
Cache-Control: max-age=15
หากผู้ใช้ค้อนF5พวกเขาจะได้รับรุ่นแคชเป็นเวลา 15 วินาที หากเป็นพร็อกซีขององค์กรผู้ใช้ 67198 คนที่กดปุ่มหน้าเดียวกันในหน้าต่าง 15 วินาทีเดียวกันทั้งหมดจะได้รับเนื้อหาเดียวกัน - ทั้งหมดทำหน้าที่จากแคชที่ปิด ผลงานที่ชนะสำหรับทุกคน
ข้อดีของการเพิ่มCache-Control: max-age
คือเบราว์เซอร์ไม่จำเป็นต้องดำเนินการตามเงื่อนไข
- หากคุณระบุเท่านั้น
Last-Modified
เบราว์เซอร์จะต้องดำเนินการตามคำขอIf-Modified-Since
และคอยดู304 Not Modified
คำตอบ
- หากคุณระบุ
max-age
เบราว์เซอร์จะไม่ต้องประสบกับเครือข่ายไปกลับ เนื้อหาจะออกมาจากแคช
ความแตกต่างระหว่าง "การควบคุมแคช: อายุสูงสุด" และ "หมดอายุ"
Expires
เป็นสิ่งที่เทียบเท่ามรดกของCache-Control: max-age
ส่วนหัวที่ทันสมัย (c. 1998) :
เว็บไซต์ใด ๆ ที่เขียนขึ้นหลังจากที่ 1998 ไม่ควรใช้อีกต่อไปและใช้แทนExpires
max-age
ETag คืออะไร
ETagมีความคล้ายคลึงกับLast-Modifiedยกเว้นว่ามันไม่จำเป็นต้องเป็นวันที่ - มันก็จะต้องมีบางสิ่งบางอย่าง
หากฉันดึงรายการผลิตภัณฑ์ออกจากฐานข้อมูลเซิร์ฟเวอร์สามารถส่งรายการสุดท้ายrowversion
เป็น ETag แทนที่จะเป็นวันที่:
200 OK
ETag: "247986"
ETag ของฉันสามารถแฮช SHA1 ของทรัพยากรแบบคงที่ (เช่นรูปภาพ, js, css, แบบอักษร) หรือของหน้าที่แสดงผลแคช (เช่นนี่คือสิ่งที่ Mozilla MDN wiki ทำ; พวกเขาแฮชอัปมาร์กอัปสุดท้าย):
200 OK
ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4"
และเหมือนกับในกรณีของคำขอตามเงื่อนไขโดยยึดตามการแก้ไขครั้งสุดท้าย :
GET / HTTP/1.1
If-Modified-Since: Tue, 16 Oct 2012 03:13:38 GMT
304 Not Modified
ฉันสามารถดำเนินการตามเงื่อนไขตาม ETag:
GET / HTTP/1.1
If-None-Match: "33a64df551425fcc55e4d42a148795d9f25f89d4"
304 Not Modified
ETag
จะดีกว่าLast-Modified
เพราะมันเหมาะกับสิ่งที่นอกเหนือจากไฟล์หรือสิ่งที่มีความคิดของวัน มันเป็นเพียงแค่