ทำไมคำตอบนี้ถูกแคช?


32

ฉันมีลูกค้าที่มี index.html ของเว็บไซต์กลับมาพร้อมกับส่วนหัวเหล่านี้:

ยอมรับช่วง: ไบต์
การเชื่อมต่อ: Keep-Alive
การเข้ารหัสเนื้อหา: gzip
ความยาวเนื้อหา: 3658
ประเภทเนื้อหา: ข้อความ / html
วันที่: พฤหัสบดี, 10 ต.ค. 2556 07:36:27 GMT
ETag: "4aa95e1-2ed2-4e721324728b7"
Keep-Alive: หมดเวลา = 5, สูงสุด = 100
ปรับเปลี่ยนครั้งล่าสุด: อังคาร, 24 กันยายน 2013 13:34:30 GMT
เซิร์ฟเวอร์: Apache / 2.2.22
แตกต่างกัน: ยอมรับการเข้ารหัส, User-Agent

เห็นได้ชัดว่าฉันจะแนะนำให้พวกเขาเพิ่มExpiresหรือCache-Controlตามความเหมาะสม แต่ฉันสับสน: Chrome แคชทรัพยากรนี้และใช้งานได้จากแคช (ไม่ส่งคำขอเลย ) แม้หลังจากผ่านไปหลายชั่วโมง (เช่นมันนำสำเนามาใช้ซ้ำ) มันแคชเมื่อวานนี้เวลา 13:30 น. เช้านี้เวลา 8:30 น.) ฉันเห็นสิ่งนี้ค่อนข้างชัดเจนในแท็บเครือข่ายของคอนโซล Chrome ซึ่งจะแสดงคำขอและมี200 (OK)สีเทาในคอลัมน์สถานะและ(from cache)ในคอลัมน์ขนาด (ฉันไม่ได้เปลี่ยนค่าเริ่มต้นแคชของ Chrome)

ฉันรู้ว่าข้อมูลจำเพาะอนุญาตให้ตัวแทนผู้ใช้ทำการตัดสินใจด้วยตนเองในทิศทางที่ขาดหายไปจากส่วนหัว นั่นคือสิ่งที่เกิดขึ้นที่นี่? Chrome เห็นว่ามีการแก้ไขครั้งล่าสุดเมื่อหลายวันก่อนและรู้สึกอิสระที่จะใช้รุ่นที่อัปเดตทุกวันหรือไม่ หรือมีบางอย่างที่ฉันขาดหายไป?

คำตอบ:


33

เมื่อ "หมดอายุ" และ "Cache-Control" หัวไม่ได้ระบุไว้ แต่ส่วนหัว "Last-Modified" ถูกระบุเบราว์เซอร์ได้มีการคาดเดาว่านานพวกเขาควรจะเก็บเอกสารในแคช เบราว์เซอร์บางทำขั้นตอนวิธีการใช้งานที่ช่วยให้หน้ายังคงอยู่ในแคชสำหรับวันหรือมากกว่า

แนวทางการปฏิบัติที่ดีที่สุดสำหรับการแคชของ Google :

Last-Modified เป็นส่วนหัวแคช "อ่อน" ที่เบราว์เซอร์ใช้ฮิวริสติกเพื่อกำหนดว่าจะดึงรายการจากแคชหรือไม่ (ฮิวริสติกแตกต่างกันในเบราว์เซอร์ที่ต่างกัน)


Mozilla (Firefox) มี HTTP Caching FAQที่สรุปอัลกอริทึมของพวกเขาสำหรับสถานการณ์นี้ (แม้ว่าเป็นไปได้ว่าอัลกอริทึมมีการเปลี่ยนแปลงตั้งแต่เอกสารวันที่ 2002):

... เรามองหาส่วนหัว "แก้ไขครั้งสุดท้าย" หากส่วนหัวนี้มีอยู่อายุการใช้งานของแคชจะเท่ากับค่าของส่วนหัว "วันที่" ลบด้วยค่าของส่วนหัว "แก้ไขครั้งสุดท้าย" หารด้วย 10

ดังนั้นในกรณีของคุณที่ความแตกต่างระหว่างการแก้ไขและตอนนี้คือ 15 วันแล้ว Firefox จะแคชทรัพยากรเป็นเวลา 1.5 วัน

ดูเหมือนว่าเบราว์เซอร์หลักทั้งหมดใช้กฎ 10% เดียวกับที่ Firefox ใช้ คำถามได้รับการถามใน StackOveflow ขอวิเคราะห์พฤติกรรมเหล่านี้ คำตอบที่แตกต่างกันสำหรับเบราว์เซอร์ที่แตกต่างกันแสดงว่าพวกเขาทั้งหมดมีการใช้งานที่คล้ายกัน มีคำตอบสำหรับ Internet Explorer และ Webkit (Chrome และ Safari)


ขนาดของแคชของเบราว์เซอร์อาจเป็นปัจจัย จำกัด สำหรับไฟล์ที่อัลกอริทึมการแคชกำหนดอาจถูกเก็บไว้นานกว่าหนึ่งวัน เบราว์เซอร์โดยทั่วไปจะมีการตั้งค่าตามจำนวนเนื้อที่ดิสก์ที่ใช้สำหรับแคช ผู้ใช้หลายคนล้างแคชเมื่อปิดเบราว์เซอร์ ดังนั้นจำนวนเวลาที่ไฟล์ดังกล่าวถูกแคชมักจะขึ้นอยู่กับ:

  • จำนวนพื้นที่แคชที่เบราว์เซอร์จัดสรรไว้
  • จำนวนเว็บไซต์ที่ผู้ใช้เข้าชม (และขนาดของเว็บไซต์เหล่านั้น)
  • ไม่ว่าผู้ใช้จะปิดเบราว์เซอร์หรือไม่

คุณช่วยอธิบายได้ไหม "จากนั้น Firefox จะแคชทรัพยากรเป็นเวลา 1.5 วัน" ตั้งแต่วันที่ใดมันจะทำการแคชจนถึง 1.5 วัน? หากเป็นเวลา 15 วันแล้วมันจะหมดอายุแล้วใช่ไหม และเนื่องจากตอนนี้ลบด้วยการแก้ไขครั้งล่าสุดจะเพิ่มขึ้นตลอดไปคุณหมายถึงมันจะถูกเก็บไว้ตลอดไป!
myDoggyWritesCode

1
ไม่ตลอดไป สำหรับ 1/10 ของเวลาระหว่างส่วนหัวที่แก้ไขล่าสุดและเวลาที่ดาวน์โหลด หากคุณใช้เวลา 15 วันซึ่งหมายความว่าเป็นเวลา 150 วันแล้วนับตั้งแต่มีการแก้ไขไฟล์ครั้งล่าสุด
Stephen Ostermiller
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.