ส่วนหัวCache-Control: max-age=0
หมายถึงว่าเนื้อหาที่ถือว่าเก่า (และต้องโหลดซ้ำ) Cache-Control: no-cache
ทันทีซึ่งเป็นผลในสิ่งเดียวกับ
ส่วนหัวCache-Control: max-age=0
หมายถึงว่าเนื้อหาที่ถือว่าเก่า (และต้องโหลดซ้ำ) Cache-Control: no-cache
ทันทีซึ่งเป็นผลในสิ่งเดียวกับ
คำตอบ:
ฉันมีคำถามเดียวกันนี้และพบข้อมูลบางอย่างในการค้นหาของฉัน (คำถามของคุณเป็นหนึ่งในผลลัพธ์) นี่คือสิ่งที่ฉันกำหนด ...
มีสองด้านที่Cache-Control
ส่วนหัว ด้านหนึ่งคือจุดที่เว็บเซิร์ฟเวอร์สามารถส่งได้ (aka. "เซิร์ฟเวอร์ต้นทาง") อีกด้านหนึ่งคือตำแหน่งที่เบราว์เซอร์สามารถส่งได้ (aka. "user agent")
ฉันเชื่อว่าmax-age=0
เพียงแค่บอกแคช (และตัวแทนผู้ใช้) การตอบสนองค้างจาก get-go และดังนั้นพวกเขาควรตรวจสอบการตอบสนอง (เช่นกับIf-Not-Modified
ส่วนหัว) ก่อนที่จะใช้สำเนาแคชในขณะที่no-cache
บอกพวกเขาพวกเขาจะต้องตรวจสอบก่อนใช้แคช สำเนา. จาก14.9.1 Cacheable คืออะไร :
ไม่มีแคช
... แคชต้องไม่ใช้การตอบสนองเพื่อตอบสนองการร้องขอในภายหลังโดยไม่ต้องทำการตรวจสอบซ้ำกับเซิร์ฟเวอร์ต้นทาง สิ่งนี้ทำให้เซิร์ฟเวอร์ต้นทางสามารถป้องกันการแคชได้แม้กระทั่งแคชที่ได้รับการกำหนดค่าให้ส่งคืนการตอบสนองเก่าต่อคำขอของไคลเอ็นต์
กล่าวอีกนัยหนึ่งแคชอาจเลือกใช้การตอบสนองค้าง (แม้ว่าฉันเชื่อว่าต้องเพิ่มWarning
ส่วนหัว) แต่no-cache
กล่าวว่าพวกเขาไม่ได้รับอนุญาตให้ใช้การตอบกลับค้างไม่ว่าจะเกิดอะไรขึ้น บางทีคุณอาจจะต้องการควร -revalidate พฤติกรรมเมื่อสถิติเบสบอลจะเกิดขึ้นในหน้า แต่คุณต้องการต้องการต้องพฤติกรรม -revalidate เมื่อคุณได้สร้างการตอบสนองต่อการสั่งซื้อ E-commerce
แม้ว่าคุณถูกต้องในความคิดเห็นของคุณเมื่อคุณพูดว่าไม่ควรจะป้องกันไม่ให้การจัดเก็บก็จริงอาจจะมีความแตกต่างอีกเมื่อใช้no-cache
no-cache
ฉันเจอหน้าหนึ่งคำสั่งควบคุมแคชอย่างชัดเจนว่า (ฉันไม่สามารถรับรองความถูกต้องได้):
ในทางปฏิบัติ IE และ Firefox ได้เริ่มรักษาคำสั่ง no-cache ราวกับว่ามันสั่งให้เบราว์เซอร์ที่จะไม่แคชแม้แต่หน้า เราเริ่มสังเกตพฤติกรรมนี้เมื่อประมาณหนึ่งปีที่แล้ว เราสงสัยว่าการเปลี่ยนแปลงนี้ได้รับแจ้งจากการใช้คำสั่งนี้อย่างกว้างขวาง (และไม่ถูกต้อง) เพื่อป้องกันการแคช
...
โปรดสังเกตว่าการล่าช้า "การควบคุมแคช: ไม่มีแคช" ก็เริ่มทำตัวเหมือนคำสั่ง "ไม่มีร้านค้า"
เช่นกันก็จะปรากฏขึ้นกับผมว่าโดยทั่วไปจะหมายถึงสิ่งเดียวกันเช่นCache-Control: max-age=0, must-revalidate
Cache-Control: no-cache
ดังนั้นอาจเป็นวิธีที่จะได้รับพฤติกรรมที่ต้องประเมินno-cache
ในขณะที่หลีกเลี่ยงการย้ายถิ่นที่ชัดเจนของno-cache
การทำสิ่งเดียวกันเช่นno-store
(เช่นไม่มีการแคชใด ๆ )?
ฉันเชื่อว่าคำตอบของ shahkalpeshใช้กับด้านตัวแทนผู้ใช้ นอกจากนี้คุณยังสามารถดู13.2.6 disambiguating หลายคำตอบ
หากตัวแทนผู้ใช้ส่งการร้องขอด้วยCache-Control: max-age=0
(aka. "การตรวจสอบความถูกต้องแบบ end-to-end") แต่ละแคชที่อยู่ระหว่างทางจะทำการตรวจสอบรายการแคชใหม่ (เช่นด้วยIf-Not-Modified
ส่วนหัว) จนถึงเซิร์ฟเวอร์ต้นทาง หากการตอบกลับเป็น 304 (ไม่ได้แก้ไข) คุณสามารถใช้เอนทิตีแคชได้
ในทางกลับกันการส่งคำขอด้วยCache-Control: no-cache
(aka. "end-to-end reload") จะไม่ทำการตรวจสอบความถูกต้องอีกครั้งและเซิร์ฟเวอร์จะต้องไม่ใช้สำเนาแคชเมื่อตอบกลับ
must-revalidate
ไม่ได้หมายถึงเป็นเช่นเดียวกับหรือno-cache
no-store
บายพาสหลังแคชทั้งหมด แต่อดีตเพิ่งบอกว่าแคชจะต้องตรวจสอบเสมอเพื่อความสดใหม่ แต่ถ้ามันยังคงเป็นปัจจุบันก็สามารถนำมาใช้เพื่อประหยัดแบนด์วิดธ์ การบังคับหลังดาวน์โหลดแบบ end-to-end เต็มตลอดเวลารับแบนด์วิดธ์ที่ไม่จำเป็นและการตอบสนองล่าช้า
no-cache
ไม่ "บายพาสแคชทั้งหมด" หรือ "บังคับให้ดาวน์โหลดแบบ end-to-end แบบเต็มตลอดเวลา" อย่างน้อยก็ไม่ได้อยู่ในเบราว์เซอร์ทั้งหมด ข้อมูลจำเพาะบอกว่าเบราว์เซอร์นั้นจะต้องตรวจสอบแคช
max-age = 0
นี่เทียบเท่ากับการคลิกรีเฟรชซึ่งหมายความว่าให้สำเนาล่าสุดแก่ฉันยกเว้นว่าฉันมีสำเนาล่าสุดแล้ว
ไม่มีแคช
นี่คือกดปุ่ม Shift ค้างไว้ในขณะที่คลิกรีเฟรชซึ่งหมายความว่าเพียงทำซ้ำทุกสิ่ง
no-store
คำถามเก่าตอนนี้ แต่ถ้าใครมาเจอสิ่งนี้ผ่านการค้นหาอย่างที่ฉันทำปรากฏว่า IE9 จะใช้สิ่งนี้เพื่อกำหนดค่าพฤติกรรมของทรัพยากรเมื่อใช้ปุ่มย้อนกลับและไปข้างหน้า เมื่อใช้max-age = 0เบราว์เซอร์จะใช้เวอร์ชันล่าสุดเมื่อดูทรัพยากรจากการกดย้อนกลับ / ไปข้างหน้า หากไม่มีการใช้แคชทรัพยากรจะถูกดึงออกมา
รายละเอียดเพิ่มเติมเกี่ยวกับ IE9 แคชสามารถมองเห็นเกี่ยวกับเรื่องนี้MSDN บล็อกโพสต์แคช
ในการทดสอบล่าสุดของฉันกับ IE8 และ Firefox 3.5 ดูเหมือนว่าทั้งสองเป็นไปตาม RFC อย่างไรก็ตามพวกเขาแตกต่างใน "มิตร" ของพวกเขาไปยังเซิร์ฟเวอร์ต้นทาง IE8 ถือว่าการตอบสนองที่มีความหมายเช่นเดียวกับno-cache
max-age=0,must-revalidate
อย่างไรก็ตาม Firefox 3.5 นั้นดูเหมือนว่าจะno-cache
เทียบเท่ากับno-store
ซึ่งถือว่าเป็นเรื่องประสิทธิภาพและการใช้แบนด์วิดท์
โดยค่าเริ่มต้น Squid Cache นั้นดูเหมือนว่าจะไม่เก็บอะไรไว้กับno-cache
ส่วนหัวเหมือนกับ Firefox
คำแนะนำของฉันคือการตั้งค่าpublic,max-age=0
สำหรับทรัพยากรที่ไม่ไวต่อความรู้สึกที่คุณต้องการตรวจสอบความสดใหม่ในทุก ๆ การร้องขอ แต่ก็ยังช่วยให้ประสิทธิภาพและแบนด์วิดธ์ได้รับประโยชน์จากการแคช private,max-age=0
สำหรับรายการต่อผู้ใช้ที่มีการพิจารณาเดียวกันการใช้งาน
ฉันจะหลีกเลี่ยงการใช้งานของno-cache
ทั้งหมดที่ดูเหมือนว่าจะได้รับการ bastardized no-store
เบราว์เซอร์บางและแคชที่นิยมเทียบเท่ากับการทำงานของ
นอกจากนี้อย่าเลียนแบบ Akamai และ Limelight ในขณะที่พวกเขาดำเนินการแคชอาร์เรย์ขนาดใหญ่เป็นธุรกิจหลักของพวกเขาและควรเป็นผู้เชี่ยวชาญ แต่จริง ๆ แล้วพวกเขามีความสนใจที่จะทำให้ข้อมูลเพิ่มเติมถูกดาวน์โหลดจากเครือข่ายของพวกเขา Google อาจไม่ใช่ตัวเลือกที่ดีสำหรับการลอกเลียนแบบ ดูเหมือนว่าพวกเขาจะใช้max-age=0
หรือno-cache
สุ่มขึ้นอยู่กับทรัพยากร
private,max-age=0
.
max-age เมื่อแคชระดับกลางถูกบังคับโดยคำสั่ง max-age = 0 เพื่อทำการตรวจสอบความถูกต้องอีกครั้ง รายการแคชของตัวเองและลูกค้าได้ให้ตัวตรวจสอบของตัวเองในการร้องขอ ตัวตรวจสอบที่ให้มาอาจแตกต่างจากตัวตรวจสอบความถูกต้องที่เก็บไว้ในปัจจุบันกับรายการแคช ในกรณีนี้แคชอาจใช้ตัวตรวจสอบความถูกต้องในการร้องขอของตัวเองโดยไม่ต้อง มีผลต่อความโปร่งใสทางความหมาย อย่างไรก็ตามตัวเลือกของตัวตรวจสอบความถูกต้องอาจส่งผลต่อประสิทธิภาพ วิธีที่ดีที่สุดสำหรับ แคชระดับกลางที่จะใช้ตัวตรวจสอบความถูกต้องของตัวเองเมื่อทำการร้องขอ หากเซิร์ฟเวอร์ตอบกลับ ด้วย 304 (ไม่ดัดแปลง) จากนั้นแคชสามารถส่งคืนสำเนาที่ตรวจสอบแล้วตอนนี้ไปยังลูกค้า ด้วยการตอบสนอง 200 (OK) หากเซิร์ฟเวอร์ตอบกลับด้วยเอนทิตีใหม่และตัวตรวจสอบแคช อย่างไรก็ตามแคชระดับกลางสามารถเปรียบเทียบตัวตรวจสอบความถูกต้องที่ส่งคืนกับที่มีให้ใน คำขอของลูกค้าโดยใช้ฟังก์ชั่นการเปรียบเทียบที่แข็งแกร่ง ถ้าตัวตรวจสอบของลูกค้าคือ เท่ากับเซิร์ฟเวอร์ต้นทางจากนั้นแคชระดับกลางจะส่งคืน 304 (ไม่ใช่) แก้ไข) มิฉะนั้นจะส่งคืนเอนทิตีใหม่ที่มีการตอบสนอง 200 (OK) หากคำขอมีคำสั่ง no-cache ไม่ควรรวม min-fresh สูงสุดค้างหรืออายุสูงสุด
มารยาท: http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.4
อย่ายอมรับสิ่งนี้เป็นคำตอบ - ฉันจะต้องอ่านเพื่อทำความเข้าใจการใช้งานจริงของมัน :)
ฉันไม่ค่อยเชี่ยวชาญแคช แต่ Mark Nottingham คือ ที่นี่เขามีเอกสารแคช เขายังมีลิงค์ที่ยอดเยี่ยมในส่วนการอ้างอิง
จากการอ่านเอกสารเหล่านั้นของฉันดูเหมือนว่าmax-age=0
จะอนุญาตให้แคชส่งคำตอบที่แคชไปยังคำขอที่เข้ามาใน "เวลาเดียวกัน" โดยที่ "เวลาเดียวกัน" หมายถึงปิดพอเข้าด้วยกันพวกเขาดูแคชพร้อมกัน แต่no-cache
จะไม่ .
ยังไงก็ตามมันก็น่าสังเกตว่าอุปกรณ์มือถือบางตัวโดยเฉพาะผลิตภัณฑ์ของ Apple เช่น iPhone / iPad นั้นไม่สนใจส่วนหัวอย่างไม่มีแคชไม่มีร้านค้าหมดอายุ: 0 หรืออะไรก็ตามที่คุณอาจพยายามบังคับให้พวกเขาไม่ได้ใช้ซ้ำ หน้าแบบฟอร์ม
สิ่งนี้ทำให้เราไม่มีอาการปวดหัวเมื่อเราพยายามทำให้ปัญหาของ iPad ของผู้ใช้บอกว่าถูกทิ้งให้หลับไปบนหน้าเว็บที่พวกเขาเข้าถึงผ่านกระบวนการแบบฟอร์มพูดขั้นตอนที่ 2 ใน 3 แล้วอุปกรณ์จะไม่สนใจร้านค้า / คำสั่งแคชและเท่าที่ฉันสามารถบอกได้เพียงแค่ใช้สิ่งที่เป็นภาพรวมเสมือนจริงของหน้าเว็บจากสถานะสุดท้ายของมันนั่นคือการเพิกเฉยสิ่งที่มันบอกอย่างชัดเจนและไม่เพียง แต่การถ่ายหน้าที่ไม่ควรเก็บไว้ และเก็บไว้โดยไม่ตรวจสอบจริง ๆ อีกครั้งซึ่งนำไปสู่ปัญหาเซสชันแปลก ๆ ทุกประเภทรวมถึงสิ่งอื่น ๆ
ฉันแค่เพิ่มสิ่งนี้ในกรณีที่มีใครบางคนเข้ามาและไม่สามารถเข้าใจได้ว่าทำไมพวกเขาถึงได้รับข้อผิดพลาดในเซสชั่นโดยเฉพาะอย่างยิ่งไอโฟนและไอแพด
ฉันได้ทำการทดสอบดีบักเกอร์ที่กว้างขวางพอสมควรกับปัญหานี้และนี่คือข้อสรุปของฉันอุปกรณ์ละเว้นคำสั่งเหล่านี้อย่างสมบูรณ์
แม้ในการใช้งานปกติฉันพบว่าโทรศัพท์มือถือบางรุ่นยังไม่สามารถตรวจสอบเวอร์ชั่นใหม่ได้โดยบอกว่า Expires: 0 จากนั้นตรวจสอบวันที่แก้ไขล่าสุดเพื่อตรวจสอบว่าควรได้รับโทรศัพท์ใหม่หรือไม่
มันไม่ได้เกิดขึ้นดังนั้นสิ่งที่ฉันถูกบังคับให้ทำคือเพิ่มสตริงการสืบค้นลงในไฟล์ css / js ที่ฉันต้องการเพื่อบังคับให้มีการอัปเดตซึ่งหลอกให้อุปกรณ์เคลื่อนที่โง่ ๆ คิดว่าเป็นไฟล์ที่ไม่มีอยู่เช่น: ของฉัน .css? v = 1 จากนั้น v = 2 สำหรับการอัปเดต css / js ส่วนใหญ่ใช้งานได้
เบราว์เซอร์ของผู้ใช้ยังคงเป็นไปตามค่าเริ่มต้น ณ ปี 2559 ตามที่ฉันค้นพบอย่างต่อเนื่อง (เราทำการเปลี่ยนแปลงและอัปเดตในเว็บไซต์ของเราเป็นจำนวนมาก) ไม่สามารถตรวจสอบวันที่แก้ไขล่าสุดในไฟล์ดังกล่าวได้ วิธีการสตริงแก้ไขปัญหาที่ นี่คือสิ่งที่ฉันสังเกตเห็นกับลูกค้าและคนในสำนักงานที่มักจะใช้ค่าเริ่มต้นผู้ใช้ขั้นพื้นฐานบนเบราว์เซอร์และไม่มีความรู้เกี่ยวกับปัญหาการแคชกับ css / js ฯลฯ เกือบจะล้มเหลวในการเปลี่ยน css / js ใหม่ ซึ่งหมายความว่าค่าเริ่มต้นสำหรับเบราว์เซอร์ของพวกเขาส่วนใหญ่เป็น MSIE / Firefox ไม่ได้ทำในสิ่งที่พวกเขาบอกให้ทำพวกเขาไม่สนใจการเปลี่ยนแปลงและละเว้นวันที่แก้ไขล่าสุดและไม่ตรวจสอบแม้กับ Expires: 0 ตั้งอย่างชัดเจน
นี่เป็นหัวข้อที่ดีที่มีข้อมูลทางเทคนิคที่ดีมากมาย แต่ก็เป็นสิ่งสำคัญที่จะต้องทราบว่าการสนับสนุนสิ่งนี้แย่มากในอุปกรณ์มือถือโดยเฉพาะ ทุกๆสองสามเดือนฉันต้องเพิ่มเลเยอร์การป้องกันที่มากขึ้นจากความล้มเหลวในการทำตามคำสั่งส่วนหัวที่ได้รับหรือเพื่อขัดจังหวะคำสั่งเหล่านั้นอย่างถูกต้อง
สิ่งหนึ่งที่ (ไม่น่าแปลกใจ) ที่ไม่ได้กล่าวถึงคือคำขอสามารถระบุอย่างชัดเจนว่าจะยอมรับข้อมูลเก่าโดยใช้max-stale
คำสั่ง ในกรณีนั้นหากเซิร์ฟเวอร์ตอบสนองmax-age=0
แคชจะพิจารณาเพียงแค่การตอบสนองค้างและจะมีอิสระที่จะใช้เพื่อตอบสนองคำขอของลูกค้า [ซึ่งขอข้อมูลที่อาจมีข้อมูลเก่า] ในทางตรงกันข้ามหากเซิร์ฟเวอร์ส่งno-cache
ว่าลูกค้าที่ร้องขอจริง ๆ (ด้วยmax-stale
) สำหรับข้อมูลเก่าเนื่องจากแคชต้องตรวจสอบความถูกต้องอีกครั้ง
ความแตกต่างคือไม่มีแคช (ไม่มีร้านค้าบน Firefox) ป้องกันการแคชทุกชนิด สิ่งนี้มีประโยชน์ในการป้องกันหน้าเว็บที่มีเนื้อหาที่ปลอดภัยถูกเขียนลงบนดิสก์และสำหรับหน้าเว็บที่ควรได้รับการอัปเดตอยู่เสมอแม้ว่าจะกลับมาเยี่ยมชมอีกครั้งด้วยปุ่มย้อนกลับ
max-age = 0 บ่งชี้ว่ารายการแคชเก่าและต้องการการตรวจสอบความถูกต้องอีกครั้ง แต่ไม่ได้ป้องกันการแคช บ่อยครั้งที่เบราว์เซอร์ตรวจสอบความถูกต้องของทรัพยากรเพียงครั้งเดียวต่อเซสชันของเบราว์เซอร์ดังนั้นเนื้อหาอาจไม่ได้รับการอัปเดตจนกว่าจะมีการเยี่ยมชมไซต์ในเซสชันใหม่
โดยปกติแล้วเบราว์เซอร์จะไม่ลบรายการแคชที่หมดอายุเว้นแต่ว่าพวกเขาจะเรียกคืนพื้นที่สำหรับเนื้อหาที่ใหม่กว่าเมื่อแคชของเบราว์เซอร์เต็ม การใช้ไม่มีร้านค้าไม่มีแคชทำให้สามารถลบรายการแคชได้อย่างชัดเจน
max-age=0
หากคุณหมายถึงอนุญาตให้แคชได้ แต่ทรัพยากรควรได้รับการตรวจสอบซ้ำและno-store
หากคุณไม่ต้องการให้การตอบสนองถูกเก็บไว้ในแคชเลย no-cache
ถูกกำหนดให้สุ่มหมายถึงทั้งสองเหล่านี้ขึ้นอยู่กับผู้ขายตัวแทนของผู้ใช้และจำนวนรุ่นและโปรโตคอลการถ่ายโอน