ฟังก์ชันของส่วนหัว HTTP“ Vary: Accept” คืออะไร


93

ฉันใช้ PHP เพื่อสร้างเว็บเพจแบบไดนามิก ตามที่ระบุไว้ในบทช่วยสอนต่อไปนี้ (ดูลิงค์ด้านล่าง) เอกสาร XHTML ประเภท MIME ควรเป็น "application / xhtml + xml" เมื่อ $ _SERVER ['HTTP_ACCEPT'] อนุญาต เนื่องจากคุณสามารถแสดงเพจเดียวกันโดยใช้ MIME 2 แบบ ("application / xhtml + xml" และ "text / html") คุณควรตั้งค่าส่วนหัว HTTP "Vary" เป็น "Accept" สิ่งนี้จะช่วยแคชบนพร็อกซี

ลิงก์: http://keystonewebsites.com/articles/mime_type.php

ตอนนี้ฉันไม่แน่ใจถึงความหมายของ: header ('Vary: Accept'); ฉันไม่แน่ใจจริงๆว่า 'Vary: Accept' จะทำอะไรได้อย่างแม่นยำ ...

คำอธิบายเดียวที่ฉันพบคือ:

หลังจากส่วนหัว Content-Type แล้วส่วนหัว Vary จะถูกส่งไปยัง (ถ้าฉันเข้าใจถูกต้อง) บอกแคชระดับกลางเช่นพร็อกซีเซิร์ฟเวอร์ว่าประเภทเนื้อหาของเอกสารจะแตกต่างกันไปขึ้นอยู่กับความสามารถของไคลเอ็นต์ที่ร้องขอเอกสาร http://www.456bereastreet.com/archive/200408/content_negotiation/

ใครก็ได้สามารถให้คำอธิบาย "ตามความเป็นจริง" ของส่วนหัวนี้ ( พร้อมค่านั้น ) ฉันคิดว่าฉันเข้าใจสิ่งต่างๆเช่น: Vary: Accept-Encoding ที่แคชบนพร็อกซีอาจเป็นไปตามการเข้ารหัสของหน้าที่ให้บริการ แต่ฉันไม่เข้าใจ: Vary: Accept


1
ตรงไปตรงมา - ไม่ต้องกังวล ทิ้งข้อบกพร่องในการใช้งานบนไซต์นั้นครั้งเดียวที่คุณจะได้รับประโยชน์จากการให้บริการด้วยเนื้อหาประเภท XML คือเมื่อคุณทำสิ่งที่ไม่สามารถทำได้ในข้อความ / html - และหากคุณทำทั้งหมด กำลังเปลี่ยน Doctype และ xmlns คุณจะไม่ทำสิ่งเหล่านั้น ติดข้อความ / html สำหรับเรื่องนั้นคุณอาจยึดติดกับ HTML 4.01 เช่นกัน
Quentin

ใช่ฉันเข้าใจสิ่งนี้และฉันคิดว่า "ปัญหา" เช่นนี้เกิดขึ้นบ่อยเกินไปในการพัฒนาเว็บ ขอบคุณ "ควร" ในข้อกำหนด / RFCs!
AlexV

2
คุณควรอ่านสิ่งนี้: blogs.msdn.com/ieinternals/archive/2009/06/17/…ก่อนพิจารณาใช้ VARY
EricLaw

1
วิดีโอนี้มีคำอธิบายที่ดีเกี่ยวกับVary:ส่วนหัว
Kannan Mohan

คำตอบ:


94
  • cache-controlส่วนหัวเป็นกลไกหลักสำหรับเซิร์ฟเวอร์ HTTP จะบอกพร็อกซีแคช "ความสด" ของการตอบสนอง (กล่าวคือนานแค่ไหน / ถ้าจะเก็บการตอบสนองในแคช)

  • ในบางสถานการณ์cache-controlคำสั่งไม่เพียงพอ การอภิปรายจากกลุ่มการทำงาน HTTP ถูกเก็บถาวรที่นี่โดยอธิบายถึงหน้าที่มีการเปลี่ยนแปลงตามภาษาเท่านั้น นี่ไม่ใช่กรณีการใช้งานที่ถูกต้องสำหรับส่วนหัวที่แตกต่างกัน แต่บริบทมีค่าสำหรับการสนทนาของเรา (แม้ว่าฉันเชื่อว่าส่วนหัว Vary จะแก้ปัญหาได้ในกรณีนั้น แต่ก็มีวิธีที่ดีกว่า) จากหน้านั้น:

Vary โดยเฉพาะอย่างยิ่งสำหรับกรณีเหล่านั้นที่สิ้นหวังหรือซับซ้อนเกินไปสำหรับพร็อกซีในการจำลองสิ่งที่เซิร์ฟเวอร์จะทำ

  • RFC2616 "Header-Field Definitions"อธิบายการใช้งานส่วนหัวจากมุมมองของเซิร์ฟเวอร์RFC2616 "Caching Negotiated Responses"จากมุมมองของพร็อกซีการแคช มีวัตถุประสงค์เพื่อระบุชุดส่วนหัวของคำขอ HTTP ที่กำหนดความเป็นเอกลักษณ์ของคำขอ

ตัวอย่างที่สร้างขึ้น:

เซิร์ฟเวอร์ HTTP ของคุณมีหน้า Landing Page ขนาดใหญ่ คุณมีสองหน้าที่แตกต่างกันเล็กน้อยโดยมี URL เดียวกันขึ้นอยู่กับว่าผู้ใช้เคยอยู่ที่นั่นมาก่อนหรือไม่ คุณแยกความแตกต่างระหว่างคำขอและ "จำนวนการเยี่ยมชม" ของผู้ใช้โดยพิจารณาจากคุกกี้ แต่ - เนื่องจากหน้า Landing Page ของเซิร์ฟเวอร์ของคุณมีขนาดใหญ่มากคุณจึงต้องการให้พร็อกซีตัวกลางแคชการตอบกลับหากเป็นไปได้

ส่วนหัว URL, Last-Modified และ Cache-Control ไม่เพียงพอที่จะให้ข้อมูลเชิงลึกนี้แก่พร็อกซีการแคช แต่ถ้าคุณเพิ่มVary: Cookieเครื่องมือแคชจะเพิ่มส่วนหัวคุกกี้ในการตัดสินใจในการแคช

สุดท้ายสำหรับการเข้าชมขนาดเล็กเว็บไซต์แบบไดนามิก - ฉันพบเสมอว่าง่ายCache-Control: no-cache, no-storeและPragma: no-cacheเพียงพอ

แก้ไข - เพื่อตอบคำถามของคุณอย่างแม่นยำยิ่งขึ้น: ส่วนหัวคำขอ HTTP "ยอมรับ" กำหนดประเภทเนื้อหาที่ไคลเอ็นต์สามารถประมวลผลได้ หากคุณมีสำเนาของเนื้อหาเดียวกันสองชุดใน URL เดียวกันซึ่งแตกต่างกันเฉพาะในประเภทเนื้อหาการใช้งานVary: Acceptอาจเหมาะสม

อัปเดต 11 ก.ย. 55:

ฉันรวมลิงก์สองลิงก์ที่ปรากฏในความคิดเห็นตั้งแต่ความคิดเห็นนี้ถูกโพสต์ครั้งแรก ทั้งคู่เป็นแหล่งข้อมูลที่ยอดเยี่ยมสำหรับตัวอย่างในโลกแห่งความจริง (และปัญหา) ด้วย Vary: Accept; หากคุณกำลังอ่านคำตอบนี้คุณจำเป็นต้องอ่านลิงก์เหล่านั้นด้วย

ครั้งแรกจาก EricLaw ที่โดดเด่นเกี่ยวกับพฤติกรรมของ Internet Explorer ที่มีแตกต่างกันไปส่วนหัวและบางส่วนของความท้าทายที่จะนำเสนอให้กับนักพัฒนา: วารีหัวป้องกันแคชใน IE กล่าวโดยย่อ IE (ก่อน IE9) จะไม่แคชเนื้อหาใด ๆ ที่ใช้ส่วนหัว Vary เนื่องจากแคชของคำขอไม่มีส่วนหัว HTTP Request EricLaw (Eric Lawrence ในโลกแห่งความเป็นจริง) เป็นผู้จัดการโปรแกรมในทีม IE

ประการที่สองคือจาก Eran เมดานและเป็นที่กำลังอภิปรายของพฤติกรรมที่ไม่คาดคิดแตกต่างกันที่เกี่ยวข้องใน Chrome: ถือหางไม่ได้จัดการกับวารีหัวได้อย่างถูกต้อง มันเกี่ยวข้องกับพฤติกรรมของ IE ยกเว้นนักพัฒนา Chrome ใช้วิธีการที่แตกต่างออกไปแม้ว่าดูเหมือนว่าจะไม่ได้เป็นทางเลือกโดยเจตนาก็ตาม


3
ระวังสิ่งนี้ร่วมกับปุ่มย้อนกลับของเบราว์เซอร์ใน Chrome มีสงครามเปลวไฟกับข้อผิดพลาดนี้ (ซึ่งตอนนี้ไม่สามารถแก้ไขได้ด้วยเหตุผลบางประการ) code.google.com/p/chromium/issues/detail?id=94369
Eran Medan

6
@EranMedan ข้อบกพร่องของ Chrome ได้รับการแก้ไขแล้ว

59

Vary: Acceptพูดง่ายๆว่าการตอบกลับสร้างขึ้นตามAcceptส่วนหัวในคำขอ คำขอที่มีAcceptส่วนหัวต่างกันอาจได้รับคำตอบที่แตกต่างกัน

(คุณจะเห็นว่าโค้ด PHP ที่เชื่อมโยงดู$HTTP_ACCEPTนั่นคือค่าของAcceptส่วนหัวของคำขอ)

สำหรับแคช HTTP หมายความว่าการตอบกลับจะต้องถูกแคชด้วยความระมัดระวังเป็นพิเศษ จะเป็นการจับคู่ที่ถูกต้องสำหรับคำขอในภายหลังที่มีAcceptส่วนหัวเดียวกันทั้งหมดเท่านั้น

ตอนนี้สิ่งนี้จะสำคัญก็ต่อเมื่อหน้านั้นสามารถแคชได้ตั้งแต่แรก ตามค่าเริ่มต้นหน้า PHP ไม่ได้ หน้า PHP สามารถทำเครื่องหมายผลลัพธ์ว่าแคชได้โดยส่งส่วนหัวบางอย่าง (Expiresเช่น) แต่จะทำอย่างไรและเป็นคำถามที่แตกต่างกัน


มัน "อาจจะได้รับ" หรือมัน "ควรจะได้รับ"?
Pacerier

6
@Pacerier "might get" ถูกต้อง Vary: Acceptไม่ได้หมายความว่าทุกAcceptค่าส่วนหัวที่แตกต่างกันที่เป็นไปได้จะก่อให้เกิดการตอบสนองที่แตกต่างและไม่ซ้ำใคร หมายความว่าAcceptส่วนหัวที่แตกต่างกันอาจให้การตอบสนองที่แตกต่างกัน
Jason Orendorff


2

มีคุณลักษณะใหม่จำนวนมากในเร็ว ๆ นี้ (และมีอยู่แล้วใน Chrome) ซึ่งทำให้Varyส่วนหัวมีประโยชน์อย่างยิ่ง ตัวอย่างเช่นพิจารณาไคลเอ็นต์ Hinting เมื่อใช้ในการเชื่อมต่อกับรูปภาพตัวอย่างเช่นการบอกใบ้ไคลเอนต์ช่วยให้เซิร์ฟเวอร์ปรับแต่งทรัพยากรเช่นรูปภาพโดยขึ้นอยู่กับ:

  • ความกว้างของภาพ
  • ความกว้างของวิวพอร์ต
  • ประเภทการเข้ารหัสที่เบราว์เซอร์รองรับ (คิดว่า WebP)
  • Downlink (ความเร็วเครือข่ายเป็นหลัก)

ดังนั้นเซิร์ฟเวอร์ที่รองรับคุณสมบัติเหล่านั้นจะตั้งค่าVaryส่วนหัวเพื่อระบุสิ่งนั้น

Chrome โฆษณาการสนับสนุน WebP โดยตั้งค่า "image / webp" เป็นส่วนVaryหัวของแต่ละคำขอ ดังนั้นเซิร์ฟเวอร์อาจเขียนภาพใหม่เป็น WebP หากเบราว์เซอร์รองรับดังนั้นพร็อกซีจะต้องตรวจสอบส่วนหัวเพื่อไม่ให้แคชอิมเมจ WebP จากนั้นให้บริการไปยังเบราว์เซอร์ที่ไม่รองรับ WebP เห็นได้ชัดว่าหากเซิร์ฟเวอร์ของคุณไม่ทำเช่นนั้นก็ไม่สำคัญ ดังนั้นเนื่องจากการตอบสนองของเซิร์ฟเวอร์แตกต่างกันไปAcceptตามส่วนหัวของคำขอการตอบสนองจึงต้องรวมสิ่งนั้นไว้เพื่อไม่ให้พร็อกซีสับสน:

Vary: Accept

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

Vary: Accept, Width

หรือในกรณีที่เซิร์ฟเวอร์รองรับไคลเอนต์ทั้งหมดที่บอกใบ้ข้อกำหนดส่วนหัวจะเป็นดังนี้:

Vary: Accept, DPR, Width, Save-Data, Downlink
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.