if-modified-since vs if-none-match


90

อะไรคือความแตกต่างระหว่าง if-modified-since และ if-none-match? ฉันรู้สึกว่าใช้ if-none-match สำหรับไฟล์ในขณะที่ if-modified-since ใช้สำหรับเพจ?

คำตอบ:


113

เกี่ยวกับความแตกต่างระหว่างLast-Modified/If-Modified-SinceและETag/If-None-Match:

ทั้งสองสามารถใช้แทนกันได้ อย่างไรก็ตามขึ้นอยู่กับประเภทของทรัพยากรและวิธีการสร้างทรัพยากรบนเซิร์ฟเวอร์คำถามหนึ่งข้อหรือคำถามอื่น ๆ ("สิ่งนี้ถูกแก้ไขตั้งแต่ ... ?" / "สิ่งนี้ยังตรงกับ ETag นี้หรือไม่") อาจจะตอบได้ง่ายกว่า .

ตัวอย่าง:

  • หากคุณกำลังให้บริการไฟล์การใช้ไฟล์mtimeเป็นLast-Modifiedวันที่เป็นวิธีที่ง่ายที่สุด
  • หากคุณกำลังให้บริการหน้าเว็บแบบไดนามิกที่สร้างขึ้นจากการสืบค้น SQL จำนวนหนึ่งการตรวจสอบว่าข้อมูลที่ส่งกลับโดยคำค้นหาเหล่านั้นมีการเปลี่ยนแปลงหรือไม่อาจใช้ไม่ได้จริง (เว้นแต่ว่าข้อมูลทั้งหมดจะมีคอลัมน์ "แก้ไขล่าสุด" บางประเภท) ในกรณีนี้การใช้เช่นแฮช md5 ของเนื้อหาเพจเนื่องจากETagจะง่ายกว่ามาก
    OTOH ซึ่งหมายความว่าคุณยังคงต้องสร้างทั้งหน้าบนเซิร์ฟเวอร์แม้กระทั่ง GET แบบมีเงื่อนไข การหาสิ่งที่ต้องเข้าไปใน ETag (คีย์หลักหมายเลขการแก้ไข ... ฯลฯ ) สามารถช่วยคุณประหยัดเวลาได้มากที่นี่

ดูลิงค์เหล่านี้สำหรับรายละเอียดเพิ่มเติมในหัวข้อ:


ฉันได้ส่ง ETag ไปยังเบราว์เซอร์ แต่ไม่เคยขอหน้าเดียวกันกับ If-None-Match ปัญหาอาจเกิดจากอะไร?
Pacerier

2
@pacerier: เบราว์เซอร์ไม่จำเป็นต้องใช้ Etag ดังนั้นจึงอาจเป็นเบราว์เซอร์รุ่นเก่าและไม่สนใจมัน ความเป็นไปได้อื่น ๆ คือเอนทิตีถูกเข้าถึงด้วยพารามิเตอร์ url ที่เปลี่ยนจากการโทรเป็นการโทร หากชื่อเอนทิตีเปลี่ยนไปจะไม่ใช้ etag สำหรับคำขออื่น
Rafael Baptista

@RafaelBaptista หากต้องการอธิบายเพิ่มเติมเกี่ยวกับความคิดเห็นครึ่งหลังของคุณให้บอกว่าฉันมีสถานการณ์นี้: ฉันมีไฟล์เซิร์ฟเวอร์และเซิร์ฟเวอร์รองรับการกำหนดเวอร์ชันโดยใช้ ETags และด้วยเหตุผลด้านความเข้ากันได้ย้อนหลังเราเคยให้ไคลเอนต์ใช้พารามิเตอร์การสืบค้น my_current_version = (version ). ถ้าฉันส่งคำขอ HTTP ที่มีค่าต่างกันสำหรับ my_current_version แต่ยังมี ETags เกณฑ์ใดเป็นแนวทางปฏิบัติที่ดีที่สุดจะได้รับการจัดลำดับความสำคัญเมื่อพิจารณาว่าจะให้บริการเวอร์ชันใหม่หรือส่งกลับ 304 ขอบคุณ!
laughing_man

1
วิธีที่เซิร์ฟเวอร์ใช้ Etag นั้นขึ้นอยู่กับเซิร์ฟเวอร์ คุณอาจกำหนดค่าไฟล์เซิร์ฟเวอร์ส่วนใหญ่ให้ละเว้นพารามิเตอร์ด้วย etag ได้หากคุณต้องการผ่านกฎการเขียนซ้ำ คุณควบคุมไคลเอนต์ได้น้อยลง - เบราว์เซอร์ ส่วนใหญ่จะไม่ส่งส่วนหัว etag ที่ได้รับสำหรับพารามิเตอร์ชุดหนึ่งในการร้องขอสำหรับอีกชุดหนึ่ง คำขอของลูกค้าสำหรับรูปภาพ? v = 1 จะไม่ส่ง etag เดียวกันสำหรับรูปภาพ? v = 2 ถ้าฉันเขียนเซิร์ฟเวอร์ของตัวเองฉันจะใช้ etag เป็นแฮชของเนื้อหารูปภาพ URL ใด ๆ ที่ขอทรัพยากรและมาพร้อมกับ etag ที่ตรงกับแฮชของรูปภาพที่ฉันจะส่งฉันจะส่งคืน 304
Rafael Baptista

22

If-Modified-Sinceเมื่อเทียบกับLast-Modifiedในขณะที่เมื่อเทียบกับIf-None-Match ETagทั้งสองอย่างModified-SinceและETagสามารถใช้เพื่อระบุตัวแปรเฉพาะของทรัพยากร

แต่การเปรียบเทียบIf-Modified-Sinceto จะLast-Modifiedให้ข้อมูลว่าตัวแปรที่แคชเก่ากว่าหรือใหม่กว่าในขณะที่การเปรียบเทียบIf-None-Matchเพื่อETagให้ข้อมูลว่าทั้งสองเหมือนกันหรือไม่หรือไม่ นอกจากนี้ETagเครื่องกำเนิดไฟฟ้าส่วนใหญ่ยังมีข้อมูลของไอโหนดเฉพาะของระบบดังนั้นการย้ายไฟล์ไปยังไดรฟ์อื่นอาจเปลี่ยนแปลงได้ETagเช่นกัน


น่าสนใจ แต่เหตุใดฉันจึงใช้การตรวจสอบ "เหมือนกัน" กับการตรวจสอบ "แก้ไขล่าสุด" มีประโยชน์อย่างไร? หากมีไฟล์ให้ใช้งานตัวเลือกใดดีกว่ากัน
ทาวเวอร์

7
กับคอมพิวเตอร์เวลานั้นเปราะบาง อธิกวินาทีสลับไปมาระหว่างเวลาออมแสงของวันและนาฬิกาที่ไม่ถูกต้องทั้งหมดอาจทำให้การตรวจสอบ "แก้ไขล่าสุด" แสดงผลลัพธ์ที่ไม่ถูกต้อง การเปรียบเทียบเนื้อหาเอง (หรือแฮช MD5 ของเนื้อหา) ช่วยหลีกเลี่ยงปัญหาเหล่านั้น
devdanke

แม้ว่าฉันจะเข้าใจ @devdanke อย่างเต็มที่ แต่ฉันก็บอกได้ว่าการตรวจสอบการประทับเวลาเร็วกว่าการตรวจสอบ md5sum จุดประสงค์ของส่วนหัวเหล่านี้คือทำให้รวดเร็วบางครั้งก็ไม่ต้องการถ่ายโอนเอนทิตีเวอร์ชันใหม่ไปยังไคลเอ็นต์มากกว่าการโหลดเซิร์ฟเวอร์ด้วย I / O อย่างไรก็ตามผู้ใช้สามารถกด ctrl + shift + R (หรือ ctrl + F5 หรืออะไรก็ได้)
Grief

13

ค่าการประทับเวลาที่ใช้ใน Last-Modified / If-Modified-Since มีความแม่นยำ จำกัด - หนึ่งวินาทีและนั่นไม่เพียงพอสำหรับเนื้อหาที่เปลี่ยนแปลงอย่างรวดเร็วเช่นแอปพลิเคชันเว็บแชทที่สามารถโพสต์ข้อความได้มากกว่าหนึ่งข้อความในทุกวินาทีที่กำหนด . ETag / If-None-Match สามารถช่วยแก้ปัญหานั้นได้


10

ตามที่ระบุไว้ในแนวทางปฏิบัติที่ดีที่สุดของ Google:

สิ่งสำคัญคือต้องระบุหนึ่งในอายุสูงสุดของการหมดอายุหรือการควบคุมแคชและหนึ่งใน Last-Modified หรือ ETag สำหรับทรัพยากรที่สามารถแคชได้ทั้งหมด การระบุทั้ง Expires และ Cache-Control: max-age นั้นซ้ำซ้อนหรือระบุทั้ง Last-Modified และ ETag

https://developers.google.com/speed/docs/best-practices/caching


URL นั้นไม่มีข้อความที่คล้ายกันอีกต่อไป ไม่มีการระบุข้อ จำกัด ในการใช้Last-ModifiedกับETag(หรือในด้าน useragent If-Modified-Sinceด้วยIf-None-Match) ในทำนองเดียวกันข้อมูลจำเพาะ W3 ไม่ได้ จำกัด คุณ มันบอกว่าไม่ใช้If-Modified-SinceกับIf-Matchแต่ฉันคิดว่านั่นเป็นเพราะชุดเอกสารที่มีการอัปเดตวันที่ แต่เนื้อหาเดียวกับที่กำหนดโดย ETag ควรมีขนาดค่อนข้างเล็ก
mpag


3

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

ETag มีความยืดหยุ่นมากที่สุด ลูกค้าที่เป็นไปตามข้อกำหนดจะต้องส่ง ETag ในคำขอแบบมีเงื่อนไขในขณะที่พวกเขาควรส่งทั้งสองอย่างหากมี


0

ส่วนหัว If-Modified-Since ใช้เพื่อระบุเวลาที่เบราว์เซอร์ได้รับทรัพยากรที่ร้องขอครั้งล่าสุด ส่วนหัว If-None-Match ใช้เพื่อระบุแท็กเอนทิตีที่เซิร์ฟเวอร์ออกพร้อมกับรีซอร์สที่ร้องขอเมื่อได้รับล่าสุด

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

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