ปัญหาในการลดคำขอ 304

ขณะนี้ฉันกำลังพยายามลดคำขอ 304 ไปยังเว็บไซต์ของฉันให้เหลือน้อยที่สุด ฉันได้ปฏิบัติตามคำแนะนำที่เรียกร้องไว้ที่นี่:

ขอให้เบราว์เซอร์แคชมากที่สุดเท่าที่จะเป็นไปได้

อย่างไรก็ตาม ไม่ว่าฉันจะทำอะไรก็ตาม ภาพบางภาพก็ปฏิเสธที่จะถูกดึงออกจากแคช แม้ว่าภาพเหล่านั้นจะคล้ายกับภาพอื่นๆ ที่ถูกดึงก็ตาม ขณะนี้เรากำลังใช้ IIS 7.5 และ chrome เพื่อดูการรับส่งข้อมูลเครือข่าย

นี่คือตัวอย่างการตอบสนองเริ่มต้นสำหรับรูปภาพ btn-blue.png ที่จะดึงมาจากแคช:

Accept-Ranges:bytes
Content-Length:49585
Content-Type:image/png
Date:Fri, 27 Jan 2012 16:02:26 GMT
ETag:"26cb96cdccc1:0"
Expires:Sat, 31 Dec 2012 00:00:00 GMT
Last-Modified:Thu, 26 Jan 2012 20:49:46 GMT
Server:Microsoft-IIS/7.5
X-Powered-By:ASP.NET

นี่คือตัวอย่างของส่วนหัวการตอบกลับสำหรับรูปภาพ topnav-blue-poweredbyipipeline.png ซึ่งจะไม่ดึงออกจากแคช:

Accept-Ranges:bytes
Content-Length:2680
Content-Type:image/png
Date:Fri, 27 Jan 2012 16:02:17 GMT
ETag:"b85767a6cdccc1:0"
Expires:Sat, 31 Dec 2012 00:00:00 GMT
Last-Modified:Thu, 26 Jan 2012 20:49:47 GMT
Server:Microsoft-IIS/7.5
X-Powered-By:ASP.NET

มีความคิดบ้างไหมว่าทำไมคนหนึ่งถึงดึงและอีกคนหนึ่งไม่ทำ?


person Brian S.    schedule 27.01.2012    source แหล่งที่มา
comment
คุณหมายถึงเพิ่มการตอบสนอง 304 สูงสุดใช่หรือไม่ คุณต้องพิจารณาการเพิ่มส่วนหัวที่เกี่ยวข้องกับการแคชลงในการตอบกลับ (มีสองสามส่วนหัวที่ได้รับการปฏิบัติที่แตกต่างกันไปตามเบราว์เซอร์ที่ต่างกัน) จากนั้น ETag และ Expires ก็มีความเกี่ยวข้องเช่นกัน   -  person    schedule 27.01.2012
comment
จริงๆ แล้วฉันกำลังพยายามทำให้เบราว์เซอร์ไม่จำเป็นต้องโทรหาเซิร์ฟเวอร์เลย เพียงแค่ดึงมันออกจากแคช ตอนนี้ได้รับข้อความ 304 กลับมา แต่ฉันหวังว่าจะไม่ต้องโทรออกตั้งแต่แรก   -  person Brian S.    schedule 27.01.2012
comment
เบราว์เซอร์จะต้องดาวน์โหลดเนื้อหาที่อยู่ใน URL ใด ๆ อย่างน้อยหนึ่งครั้ง ขึ้นอยู่กับเซิร์ฟเวอร์ที่จะขอให้เบราว์เซอร์แคช (ในขณะเดียวกันก็ระบุวิธีการและระยะเวลา) และขึ้นอยู่กับเบราว์เซอร์ที่จะเคารพในสิ่งนั้น เซิร์ฟเวอร์ให้คำแนะนำเหล่านี้ผ่านทางส่วนหัวการตอบกลับ (การวิจัยแยกต่างหาก ฉันแค่ให้คำแนะนำแก่คุณ) และฉันค่อนข้างมั่นใจว่าเบราว์เซอร์ยอดนิยมทั้งหมดจะปฏิบัติตามคำแนะนำเหล่านั้นโดยไม่โกหกคุณ   -  person    schedule 27.01.2012
comment
คุณสามารถกำหนดสิ่งที่คุณหมายถึงโดยดึงจากแคชและไม่ดึงจากแคชได้หรือไม่?   -  person Andrew Barber    schedule 27.01.2012
comment
แน่นอน! ใน Chrome เมื่อดูแท็บเครือข่ายในเครื่องมือสำหรับนักพัฒนา ภาพบางภาพจะระบุ (จากแคช) ใต้คอลัมน์ขนาด และภาพอื่นๆ จะระบุว่า 250B หรืออะไรทำนองนั้น นอกจากนี้ใต้คอลัมน์สถานะจะระบุ 304 หากถามเซิร์ฟเวอร์ หรือ 200 หากไม่ถาม ดังนั้นฉันจึงสมมติว่าสิ่งที่ถูกทำเครื่องหมาย (จากแคช) มาจากแคชและ 304 ถูกใช้จากแคช แต่ไม่ได้ถูกดึงออกมาตั้งแต่แรก   -  person Brian S.    schedule 27.01.2012
comment
304 เป็นการตอบกลับจากเซิร์ฟเวอร์ซึ่งหมายความว่าเนื้อหาไม่มีการเปลี่ยนแปลง เบราว์เซอร์ที่มีเนื้อหาเดียวกันที่แคชไว้แต่ยังมี E-TAGGED จะถามเซิร์ฟเวอร์ว่าเนื้อหานั้นมีการเปลี่ยนแปลงหรือไม่ หากคุณลบ ETag ออกจากส่วนหัวการตอบกลับ ในขณะที่ยังคงรักษาส่วนหัวของแคช/การจัดเก็บไว้ เบราว์เซอร์จะใช้จากแคช ทีนี้ คุณจะถามว่า คุณจะทำสิ่งนั้นกับรูปภาพได้อย่างไร? จากภายใน IIS ต่อนามสกุลไฟล์ ต่อโฟลเดอร์ หรือเขียนโค้ดเพื่อสกัดกั้นทุกคำขอ (แม้แต่ไฟล์แบบคงที่) และเพิ่มส่วนหัวแคชในการตอบกลับเหล่านั้น และลบ ETag BTW, ETag เป็นสิ่งที่ดี ฉันคิดว่าคุณกำลังเสียเวลาเล็กน้อยในการมองหาความสมบูรณ์แบบ   -  person    schedule 27.01.2012
comment
อย่างไรก็ตาม หากคุณตัดสินใจที่จะเปลี่ยนส่วนหัวการตอบกลับสำหรับเนื้อหาคงที่ทั่วโลก (เช่น รูปภาพ, css, js) ให้วางแผนว่าจะบอกให้เบราว์เซอร์ส่งคำขอไฟล์เหล่านั้นอีกครั้งเมื่อมีการอัปเดตได้อย่างไร มิฉะนั้น คุณจะไม่สามารถอัปเดตไฟล์ใดๆ เหล่านั้นได้ (โดยไม่ทำให้ไซต์เสียหายสำหรับไคลเอ็นต์บางตัว) และคุณจะต้องเปลี่ยนชื่อไฟล์ (หรือเส้นทางที่มีการสืบค้น) เสมอเพื่อบังคับให้เบราว์เซอร์ร้องขออีกครั้ง   -  person    schedule 27.01.2012
comment
@Hari ฉันเข้าใจสิ่งที่คุณกำลังพูด แต่สังเกตว่า Etag อยู่ในทั้งสองคำตอบ แต่หนึ่งในนั้นยังคงถูกดึงออกจากแคชและอีกอันหนึ่งไม่ได้เป็นเช่นนั้น คุณพูดถูก ดูเหมือนว่ากำลังมองหาความสมบูรณ์แบบ แต่ในกรณีนี้ ฉันมีตัวชี้วัดมากมายที่แสดงให้เห็นว่าหากฉันสามารถลดการเรียกเหล่านี้ได้ หน้าเว็บจะแสดงผลเร็วขึ้นอย่างเห็นได้ชัด   -  person Brian S.    schedule 31.01.2012
comment
ฉันค่อนข้างแน่ใจว่าคุณสามารถควบคุมสิ่งนั้นได้ผ่านโค้ด: ตรวจสอบให้แน่ใจว่า IIS ส่งคำขอเหล่านี้ไปยังแอปของคุณ และมีตัวจัดการที่เหมาะสมเพิ่มแคชและส่วนหัว etag ตามที่คุณต้องการ โดยทั่วไปแล้ว ETag จะถูกเพิ่มโดยเว็บเซิร์ฟเวอร์ (IIS) อย่างไรก็ตาม เห็นได้ชัดว่าคุณไม่ต้องการมันเลย ดังนั้น สกัดกั้นคำขอเหล่านี้ เพิ่ม/ลบส่วนหัว อย่างไรก็ตาม ยังมีวิธีลบสิ่งที่ไม่จำเป็น เช่น Server:Microsoft-IIS/7.5 และ X-Powered-By:ASP.NET ออกจากคำตอบของคุณ (ผู้ที่ชอบความสมบูรณ์แบบก็ต้องการสิ่งนั้นเช่นกัน คุณจะพบว่า googling) นอกจากนี้ บังคับการบีบอัดสำหรับเบราว์เซอร์ที่รายงานว่ารองรับในคำขอ   -  person    schedule 31.01.2012


คำตอบ (2)


ดังนั้นเราจึงเข้าใจว่าทำไมสิ่งนี้จึงเกิดขึ้น ปรากฎว่าคุณใช้ปุ่ม Enter เพื่อนำทางไปยังหน้าเว็บ Chrome จะใช้แคชอย่างจริงจัง หากคุณใช้ปุ่มรีเฟรช Chrome จะทำการเรียกเกือบทุกองค์ประกอบ

person Brian S.    schedule 15.02.2012

ทุกอย่างในโพสต์อื่นที่คุณเชื่อมโยงนั้นมีส่วนหัว Cache-Control: max-age= คุณลองแล้วหรือยัง? ฉันไม่คิดว่าหมดอายุและ etag ก็เพียงพอแล้ว ฉันคิดว่าคุณต้องมี Cache-Control ด้วย แต่ฉันยังไม่ได้ทดสอบจริงๆ

person eselk    schedule 27.01.2012
comment
จริงๆ แล้วใช่ ฉันได้ลองใช้ Cache-Control ด้วยเช่นกัน แต่ผลลัพธ์ก็เหมือนเดิม ฉันไม่คิดว่าฉันจะให้ IIS ใช้ทั้งสองอย่างได้ แต่ถ้าคุณรู้วิธีฉันก็อยากจะลอง! - person Brian S.; 27.01.2012