“ 304 Not Modified” ทำงานอย่างไร


175
  • มีการสร้างคำตอบ "304 Not Modified" อย่างไร

  • เบราว์เซอร์ตรวจสอบว่าการตอบสนองต่อคำขอ HTTP คือ 304 ได้อย่างไร

  • มันถูกตั้งค่าโดยเบราว์เซอร์หรือส่งจากเซิร์ฟเวอร์?

  • หากส่งจากเซิร์ฟเวอร์เซิร์ฟเวอร์จะทราบข้อมูลที่มีอยู่ในแคชได้อย่างไรและจะกำหนด 304 ภาพอย่างไร

ฉันเดาว่าถ้ามันถูกสร้างโดยเบราว์เซอร์:

function is_modified()
{
    return get_data_from_cache() === get_data_from_url();
}

function get_data_from_cache()
{
    return some_hash_or_xxx_function(cache_data);
}

function get_data_from_url()
{
     return some_hash_or_xxx_function(new_data);
}

function some_hash_or_xxx_function(data)
{
     // Do something with the data.
     // What is that algorithm?
     return result;
}

console.log(is_modified());

ฉันพึ่งพาผู้ให้บริการ API บุคคลที่สามเพื่อรับข้อมูลแยกวิเคราะห์และพุชไปยังฐานข้อมูลของฉัน ข้อมูลอาจมีหรือไม่มีการเปลี่ยนแปลงในระหว่างขอทุก 200แต่ส่วนหัวจะส่ง ฉันไม่ต้องการที่จะแยกตรวจสอบ ID ที่ไม่ซ้ำสุดท้ายใน DB และอื่น ๆ ... เพื่อตรวจสอบการเปลี่ยนแปลงในข้อมูลหรือเปรียบเทียบผลโดยตรงค่อนข้างฉันmd5(), sha1()และcrc32()ถกผลและผลงานดี แต่ฉันสงสัยเกี่ยวกับ 304ขั้นตอนวิธีการในการกำหนด

ฉันต้องการใช้อัลกอริทึมชนิดเดียวกันเพื่อพิจารณาการเปลี่ยนแปลงข้อมูลของฉัน


2
ใช่ฉันใช้ Google เพื่อดูว่า 304 ไม่ได้ทำงานอย่างไรแต่ไม่ได้รับคำตอบ
VenomVendor

1
คุณจะต้องกว้างขึ้นอีกหน่อย google.com/search?q=http%20caching
SLaks

คำตอบ:


201

เมื่อเบราว์เซอร์ใส่บางสิ่งในแคชเบราว์เซอร์จะเก็บLast-ModifiedหรือETagส่วนหัวไว้จากเซิร์ฟเวอร์

จากนั้นเบราว์เซอร์จะส่งคำขอพร้อมกับส่วนหัวIf-Modified-SinceหรือIf-None-Matchบอกให้เซิร์ฟเวอร์ส่ง 304 หากเนื้อหายังคงมีวันที่หรือ ETag

เซิร์ฟเวอร์ต้องการวิธีการคำนวณวันที่แก้ไขหรือ ETag สำหรับแต่ละรุ่นของแต่ละทรัพยากร สิ่งนี้มักมาจากระบบไฟล์หรือคอลัมน์ฐานข้อมูลแยกต่างหาก


1
ETagเป็นคำหลักที่ตรวจสอบกับส่วนหัวETagยังคงเหมือนเดิมทั้งในResponse Headers& Response Headers From CacheคุณสามารถบอกอัลกอริทึมETagได้ไหม ฉันได้อัปเดตคำถามที่ระบุความต้องการแล้ว
VenomVendor

4
@VenomVendor: ETagเป็นเพียงฟิลด์ที่เซิร์ฟเวอร์สามารถจัดเก็บ ID ที่ไม่ซ้ำกัน (โดยทั่วไปคือแฮชหรือหมายเลขรุ่นหรือนาฬิกาเวกเตอร์) มันไม่ได้ช่วยให้คุณคำนวณ ID นั้นได้เลย ขึ้นอยู่กับรหัสฝั่งเซิร์ฟเวอร์ของคุณ
slaks

@SLaks: จะเกิดอะไรขึ้นหากหน้านั้นมีการเรียก db ... มีโอกาสที่ข้อมูลใน db จะเปลี่ยนไป .. ในกรณีนี้มันไม่เหมาะสมที่จะตรวจสอบการโทรที่แก้ไขล่าสุดถูกต้องหรือไม่ . สภาพนี้ดูเป็นอย่างไร?
user1050619

3
@ user1050619: ขึ้นอยู่กับเซิร์ฟเวอร์ของคุณเพื่อให้แน่ใจว่า ETag นั้นถูกต้อง หากคุณแสดงข้อมูลจากฐานข้อมูลคุณจะต้องรวมข้อมูลนั้น
SLaks

สิ่งหนึ่งที่ยังไม่ชัดเจนคือถ้าคุณมีขนาดใหญ่max-ageเบราว์เซอร์จะต้องทำการร้องขอหรือไม่? (ตามที่มันอาจจะทำให้ต้นขั้วใน 304 และไม่ได้ทำการร้องขอเลย) ... คุณต้องการสิ่งนี้เช่นกับสินทรัพย์ "ลายนิ้วมือ" (มันดีตลอดกาล) มิเช่นนั้นจะเป็นประเด็นmax-ageอะไร ...
Andy Hayden

19

Last-Modified: วันที่แก้ไขล่าสุดสำหรับวัตถุที่ร้องขอ

If-Modified-Since: อนุญาตให้ส่งคืน 304 Not Modified หากวันที่แก้ไขล่าสุดไม่เปลี่ยนแปลง

ETag: ETag เป็นตัวระบุทึบแสงที่กำหนดโดยเว็บเซิร์ฟเวอร์ให้กับรุ่นเฉพาะของทรัพยากรที่พบที่ URL หากการแสดงทรัพยากรที่ URL นั้นมีการเปลี่ยนแปลง ETag ใหม่และที่แตกต่างกันจะได้รับมอบหมาย

If-None-Match: อนุญาตให้ส่งคืน 304 Not Modified หากไม่มีการเปลี่ยนแปลง ETag

เบราว์เซอร์ที่เก็บแคชพร้อมวันที่ (แก้ไขล่าสุด) หรือรหัส (ETag) เมื่อคุณต้องการขอ URL อีกครั้งเบราว์เซอร์ส่งข้อความคำขอพร้อมส่วนหัว:

ป้อนคำอธิบายรูปภาพที่นี่

เซิร์ฟเวอร์จะส่งคืน 304 เมื่อคำสั่ง if เป็นเท็จและเบราว์เซอร์จะใช้แคช

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