ความแตกต่างระหว่างไม่มีแคชและต้องตรวจสอบใหม่


179

จาก RFC 2616

http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.1

ไม่มีแคช

หากคำสั่ง no-cache ไม่ได้ระบุชื่อฟิลด์ดังนั้นแคชจะต้องไม่ใช้การตอบสนองเพื่อตอบสนองต่อการร้องขอในภายหลังโดยไม่ทำการตรวจสอบซ้ำกับเซิร์ฟเวอร์ต้นทาง สิ่งนี้ทำให้เซิร์ฟเวอร์ต้นทางสามารถป้องกันการแคชได้แม้กระทั่งแคชที่ได้รับการกำหนดค่าให้ส่งคืนการตอบสนองเก่าต่อคำขอของไคลเอ็นต์

ดังนั้นจึงแนะนำให้ตัวแทนตรวจสอบการตอบกลับทั้งหมดอีกครั้ง

เปรียบเทียบสิ่งนี้กับ

ต้องตรวจสอบใหม่

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

ดังนั้นจึงแนะนำให้ตัวแทนตรวจสอบการตอบสนองเก่าอีกครั้ง

โดยเฉพาะอย่างยิ่งในเรื่องที่no-cacheว่าตัวแทนผู้ใช้นี้ปฏิบัติต่อคำสั่งนี้อย่างชัดเจนหรือไม่?

อะไรคือสิ่งที่no-cacheถ้ามีmust-revalidateและmax-age?

ดูความคิดเห็นนี้:

http://palpapers.plynt.com/issues/2008Jul/cache-control-attributes/

ไม่มีแคช

แม้ว่าคำสั่งนี้ฟังดูเหมือนเป็นการสั่งให้เบราว์เซอร์ไม่แคชหน้าเว็บ แต่ก็มีความแตกต่างเล็กน้อย คำสั่ง“ no-cache” ตาม RFC บอกเบราว์เซอร์ว่าควรตรวจสอบความถูกต้องอีกครั้งกับเซิร์ฟเวอร์ก่อนที่จะแสดงหน้าเว็บจากแคช การตรวจสอบความถูกต้องเป็นเทคนิคที่เรียบร้อยซึ่งช่วยให้แอปพลิเคชันประหยัดแบนด์วิดท์ หากหน้าเว็บที่เบราว์เซอร์ไม่ได้เปลี่ยนเซิร์ฟเวอร์เพียงแค่ส่งสัญญาณไปยังเบราว์เซอร์และหน้าจะแสดงจากแคช ดังนั้นเบราว์เซอร์ (อย่างน้อยก็ในทางทฤษฎี) จะเก็บหน้าเว็บไว้ในแคช แต่จะแสดงเฉพาะเมื่อทำการตรวจสอบความถูกต้องใหม่กับเซิร์ฟเวอร์ ในทางปฏิบัติ IE และ Firefox ได้เริ่มรักษาคำสั่ง no-cache ราวกับว่ามันสั่งให้เบราว์เซอร์ที่จะไม่แคชแม้แต่หน้า เราเริ่มสังเกตพฤติกรรมนี้เมื่อประมาณหนึ่งปีที่แล้ว

มีใครมีอะไรเป็นทางการมากขึ้นในเรื่องนี้?

ปรับปรุง

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

นั่นคือสิ่งที่ฉันไม่เคยใส่ใจจนถึงตอนนี้ RFC กำลังบอกว่าจะไม่ใช้งานต้องทำการตรวจสอบซ้ำอีกครั้ง สิ่งนี้คือด้วยบริการบนเว็บคุณจะต้องมองในแง่ลบและถือว่าเลวร้ายที่สุดสำหรับแอพไคลเอ็นต์ที่คุณไม่รู้จัก ทรัพยากรเก่าใด ๆ ที่มีศักยภาพที่จะทำให้เกิดปัญหา

และอย่างอื่นที่ฉันเพิ่งพิจารณาโดยไม่ต้องแก้ไขครั้งสุดท้ายหรือ ETags เบราว์เซอร์สามารถดึงทรัพยากรทั้งหมดอีกครั้ง อย่างไรก็ตามด้วย ETags ฉันสังเกตว่า Chrome อย่างน้อยดูเหมือนว่าจะตรวจสอบความถูกต้องในทุกคำขอ ซึ่งทำให้ทั้งสองคำสั่ง moot หรืออย่างน้อยมีชื่อไม่ดีเนื่องจากพวกเขาไม่สามารถตรวจสอบได้อย่างถูกต้องเว้นแต่คำขอจะมีส่วนหัวอื่น ๆ ที่ทำให้ "ตรวจสอบอีกครั้ง" เสมอ

ฉันแค่ต้องการทำให้จุดสุดท้ายชัดเจนขึ้น เพียงแค่ตั้งค่าmust-revalidateแต่ไม่รวม ETag หรือ Last-Modified เอเจนต์สามารถรับเนื้อหาได้อีกครั้งเนื่องจากไม่มีสิ่งใดที่จะส่งไปยังเซิร์ฟเวอร์เพื่อเปรียบเทียบ

อย่างไรก็ตามการทดสอบเชิงประจักษ์ของฉันแสดงให้เห็นว่าเมื่อ ETag หรือข้อมูลส่วนหัวที่ถูกแก้ไขรวมอยู่ในการตอบสนองตัวแทนจะทำการตรวจสอบความถูกต้องอยู่เสมอโดยไม่คำนึงถึงการมีอยู่ของmust-revalidateส่วนหัว

ดังนั้นจุดประสงค์must-revalidateคือการบังคับให้ 'บายพาสแคช' เมื่อมันค้างซึ่งจะเกิดขึ้นเมื่อคุณตั้งค่าอายุการใช้งาน / อายุเท่านั้นดังนั้นหากmust-revalidateตั้งค่าการตอบสนองที่ไม่มีอายุหรือส่วนหัวอื่น ๆ มันจะมีประสิทธิภาพเทียบเท่ากับno-cacheตั้งแต่ การตอบสนองจะได้รับการพิจารณาค้างทันที

- ดังนั้นฉันจะทำเครื่องหมายคำตอบของ Gili ในที่สุด!


ดังนั้นในทางทฤษฎีความแตกต่างคือการตรวจสอบเสมอเทียบกับการตรวจสอบถ้า-ค้างในขณะที่ในทางปฏิบัติไม่มีแคชได้รับการรักษาโดยการเบราว์เซอร์บางอย่างเป็นความคิดเห็นที่คุณยกมากล่าวว่าในฐานะที่ไม่เคยตรวจสอบ ... ดังนั้นคุณควรให้คุณเลือกซึ่งของเหล่านั้นไปใช้ ขึ้นอยู่กับพฤติกรรมการแคชที่คุณต้องการให้บรรลุจริงในการปฏิบัติ ...
CBroe

โปรดอ่าน greenbytes.de/tech/webdav/ และดูว่าสิ่งนี้จะช่วยให้คุณเข้าใจได้หรือไม่
Julian Reschke

มีความเป็นไปได้ที่ซ้ำกันของCache-Control: max-age = 0 และ no-cache คืออะไร
Joe

ตรวจสอบต้นไม้ตัดสินใจนี้เพื่อหาคำตอบstackoverflow.com/a/49925190/3748498
pravdomil

คำตอบ:


191

ฉันเชื่อว่าmust-revalidateหมายถึง:

เมื่อแคชหมดอายุปฏิเสธที่จะส่งคืนการตอบกลับที่ค้างอยู่แก่ผู้ใช้แม้ว่าพวกเขาจะบอกว่าการตอบกลับค้างนั้นเป็นที่ยอมรับ

ในขณะที่no-cacheหมายถึง:

must-revalidate บวกกับความจริงที่ว่าการตอบสนองจะเหม็นอับทันที

หากการตอบสนองนั้นแคชได้ 10 วินาทีจากนั้นmust-revalidateจะเริ่มเล่นหลังจาก 10 วินาทีในขณะที่no-cacheหมายถึงmust-revalidateหลังจาก 0 วินาที

อย่างน้อยนั่นคือการตีความของฉัน


2
นั่นคือสิ่งที่ฉันเห็นในตอนนี้ ส่วนที่น่าสนใจคือพาราสุดท้ายของฉันโดยไม่มี ETag หรือ Last-Modified เอเจนต์ไม่มีอะไรที่จะใช้เพื่อตรวจสอบสิ่งที่มีอยู่ในแคชและต้องดาวน์โหลดโหลดทั้งหมดอีกครั้ง ดังนั้นเมื่อ RFC แจ้งว่า "ตรวจสอบใหม่" ซึ่งอาจหมายถึงให้ดึงข้อมูลอีกครั้ง
Luke Puplett

44
ซึ่งหมายถึงmax-age=0, must-revalidateและno-cacheเหมือนกัน
Anshul

5
@Anshul ในตอนแรกฉันคิดว่าคุณพูดถูกว่า 'max-age = 0, ต้องตรวจสอบซ้ำและไม่มีแคชเหมือนกัน' แต่ดูคำตอบของ Jeffrey Fox ซึ่งดูเหมือนจะระบุว่าไม่ถูกต้อง
Don Hatch

2
@Anshul ไม่must-revalidateและno-cacheมีความหมายที่แตกต่างกันสำหรับการตอบกลับที่สดใหม่: หากการตอบกลับที่แคชนั้นใหม่ (เช่นการตอบกลับยังไม่หมดอายุ) must-revalidateจะทำให้พร็อกซีแสดงผลทันทีโดยไม่ต้องทำการตรวจสอบความถูกno-cacheต้องใหม่อีกครั้ง การตอบกลับที่แคชไว้โดยไม่คำนึงถึงความสดใหม่ ที่มา: "HTTP - The Definitive Guide", หน้า 182-183
Matthias Braun

8
@ MatiasiasBraun อ่าฉันเห็นความสับสนได้แล้ว อาจเป็นได้ฉันควรเขียนno-cacheและmax-age=0, must-revalidateเหมือนกัน
Anshul

24

max-age=0, must-revalidateและno-cacheไม่เหมือนกันทั้งหมด ด้วยmust-revalidateหากเซิร์ฟเวอร์ไม่ตอบสนองต่อคำขอการตรวจสอบซ้ำเบราว์เซอร์ / พร็อกซีควรจะส่งคืนข้อผิดพลาด 504 ด้วยno-cacheก็จะแสดงเนื้อหาแคชซึ่งอาจเป็นที่ต้องการของผู้ใช้ (ดีกว่าที่จะมีสิ่งที่ค้างกว่าไม่มีอะไรเลย) นี่คือเหตุผลที่must-revalidateมีไว้สำหรับการทำธุรกรรมที่สำคัญเท่านั้น


10
ไม่แน่ใจเกี่ยวกับno-cacheการตีความของคุณ จากRFC 7234 คำสั่งการตอบสนอง "no-cache" บ่งชี้ว่าการตอบสนองต้องไม่ถูกใช้เพื่อตอบสนองการร้องขอในภายหลังโดยไม่ผ่านการตรวจสอบความถูกต้องบนเซิร์ฟเวอร์ต้นทาง สิ่งนี้อนุญาตให้เซิร์ฟเวอร์ต้นทางป้องกันไม่ให้แคชใช้เพื่อตอบสนองคำขอโดยไม่ต้องติดต่อแม้ว่าแคชที่ได้รับการกำหนดค่าให้ส่งการตอบกลับค้าง ฟังดูคล้ายกับข้อ จำกัด สำหรับmust-revalidate
Anshul

9
เจฟฟรีย์มีหลักฐานว่าการติดตั้งใช้งานเป็นไปตามที่เขาอธิบายหรือไม่
OrangeDog

ฉันคิดว่าคำตอบนี้ถูกต้องสำหรับเซิร์ฟเวอร์ proxy / lb แต่แน่นอนว่าเบราว์เซอร์จะไม่ส่งคืนค่า 504 ในกรณีนั้น
Yann Dìnendal

ดังนั้นmust-validateวิธีการmust-refresh
Simon_Weaver

15

ด้วยการตีความของ Jeffrey Fox no-cacheฉันได้ทดสอบภายใต้ chrome 52.0.2743.116 m ผลลัพธ์แสดงให้เห็นว่าno-cacheมีพฤติกรรมเหมือนกับmust-revalidateพวกเขาทั้งหมดจะไม่ใช้แคชในเครื่องเมื่อเซิร์ฟเวอร์ไม่สามารถเข้าถึงได้และพวกเขาทั้งหมดจะใช้แคชในขณะที่แตะเบราว์เซอร์กลับ / ปุ่มไปข้างหน้าเมื่อไม่สามารถเข้าถึงเซิร์ฟเวอร์ ข้างต้นฉันคิดว่าmax-age=0, must-revalidateเหมือนกันno-cacheอย่างน้อยในการใช้งาน


Chrome จะใช้แคชในตัวเครื่องหรือไม่เมื่อเซิร์ฟเวอร์พร้อมใช้งานเพื่อทำการตรวจสอบความถูกต้องอีกครั้งหรือไม่ (เช่น "If-Modified-Since") ในทั้งสองกรณี?
รวย

-2

ฉันคิดว่ามีความแตกต่างระหว่างmax-age=0, must-revalidateและno-cache :

ในmust-revalidateกรณีที่ลูกค้าได้รับอนุญาตให้ส่งIf-Modified-Sinceคำขอและให้บริการการตอบสนองจากแคชหาก304 Not Modifiedมีการส่งคืน

ในกรณีที่ลูกค้าไม่ต้องแคชการตอบสนองจึงไม่ควรใช้no-cacheIf-Modified-Since


6
แต่no-cacheไม่ได้หมายความว่าno-store- ด้วยno-cacheทรัพยากรยังคงถูกแคชไว้ในไคลเอนต์ จะต้องมีการตรวจสอบอีกครั้งก่อนที่จะใช้?
Aron

4
คุณกำลังมหันต์และno-cacheno-storeno-cacheหมายความว่าทรัพยากรต้องได้รับการตรวจสอบใหม่ ตรวจสอบใหม่มีตัวเลือกที่จะใช้การร้องขอตามเงื่อนไขเช่นและIf-None-Match If-Modified-Since
จูลส์แซม Randolph

1
@JulesRandolph: คุณอาจพูดถูก คุณมีการทดสอบ / การสาธิตหรือไม่? การยืนยันที่ปราศจากหลักฐานที่ขัดแย้งกันทั้งหมดใน q นี้น่าผิดหวัง แม้แต่คำตอบที่ยอมรับก็บอกว่า "อย่างน้อยนั่นคือการตีความของฉัน" ฉันอาจตั้งค่าเตียงทดสอบและโพสต์ที่นี่ถ้าฉันได้รับเวลา
รวย
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.