จัดการการทำงานของแคช

Firebase Hosting ใช้ CDN ทั่วโลกที่มีประสิทธิภาพเพื่อให้เว็บไซต์ของคุณทำงานได้เร็วที่สุด

ระบบจะแคชเนื้อหาแบบคงที่ที่ขอใน CDN โดยอัตโนมัติ หากคุณนำเนื้อหาของเว็บไซต์ไปใช้ซ้ำ Firebase Hosting ระบบจะล้างเนื้อหาที่แคชทั้งหมดใน CDN โดยอัตโนมัติจนกว่าจะมีการส่งคำขอครั้งถัดไป

อย่างไรก็ตาม เนื่องจากบริการ Cloud Functions และ Cloud Run สร้างเนื้อหาแบบไดนามิก เนื้อหาสำหรับ URL ที่ระบุจึงอาจแตกต่างกันไปตามสิ่งต่างๆ เช่น ข้อมูลที่ผู้ใช้ป้อนหรือข้อมูลประจำตัวของผู้ใช้ คำขอที่ จัดการโดยโค้ดแบ็กเอนด์จึงไม่ได้แคชใน CDN โดยค่าเริ่มต้น

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

ในทำนองเดียวกัน คุณสามารถกำหนดค่าลักษณะการทำงานของการแคชเพื่อลดค่าใช้จ่ายในการเรียกใช้ฟังก์ชันได้ เนื่องจากระบบจะแสดงเนื้อหาจาก CDN แทนที่จะแสดงจากฟังก์ชันที่ทริกเกอร์ อ่านเพิ่มเติมเกี่ยวกับการเพิ่มประสิทธิภาพการเรียกใช้ฟังก์ชันและบริการ ในเอกสารประกอบของ Cloud Functions และ Cloud Run

ข้อยกเว้นคือคำขอที่แสดงข้อผิดพลาด 404 CDN จะแคชการตอบกลับ 404 ของบริการไปยัง URL ที่ไม่มีอยู่เป็นเวลา 10 นาที เพื่อให้คำขอที่ตามมาสำหรับ URL นั้นแสดงจาก CDN หากคุณเปลี่ยนบริการ เพื่อให้เนื้อหาอยู่ที่ URL นี้ CDN จะแสดงข้อผิดพลาด 404 ที่แคชไว้ต่อไปเป็นเวลา 10 นาที (อย่างมาก) จากนั้นจะแสดงเนื้อหาจาก URL นั้นตามปกติ

หากการตอบกลับ 404 มีส่วนหัวการแคชที่ตั้งค่าโดยบริการ Cloud Functions หรือ Cloud Run อยู่แล้ว ส่วนหัวเหล่านั้นจะลบล้างค่าเริ่มต้น 10 นาทีและกำหนดลักษณะการทำงานของการแคชของ CDN อย่างเต็มรูปแบบ

ดูข้อมูลเพิ่มเติมเกี่ยวกับลักษณะการทำงานของการแคชได้ในเอกสารประกอบสำหรับนักพัฒนาเว็บของ Google

ตั้งค่า Cache-Control

เครื่องมือหลักที่คุณใช้ในการจัดการแคชสำหรับเนื้อหาแบบไดนามิกคือส่วนหัว Cache-Control การกำหนดค่าส่วนหัวนี้ช่วยให้คุณสื่อสารกับทั้งเบราว์เซอร์และ CDN ได้ว่าควรแคชเนื้อหานานเท่าใด ในฟังก์ชัน คุณตั้งค่า Cache-Control ดังนี้

res.set('Cache-Control', 'public, max-age=300, s-maxage=600');

ในส่วนหัวตัวอย่างนี้ คำสั่งจะทำ 3 สิ่งต่อไปนี้

  • public — ทำเครื่องหมายคำตอบเป็นpublic ซึ่งหมายความว่าทั้งเบราว์เซอร์ และแคชระดับกลาง (รวมถึง CDN สำหรับ Firebase Hosting) สามารถ แคชเนื้อหาได้

  • max-age — กำหนดอายุของคำตอบเป็นวินาทีก่อนที่จะต้อง ตรวจสอบซ้ำกับเซิร์ฟเวอร์ต้นทาง การตั้งค่านี้ใช้กับเบราว์เซอร์ หากไม่มีส่วนหัว s-maxage การตั้งค่านี้จะมีผลกับแคชอื่นๆ ทั้งหมดด้วย (รวมถึง CDN)

  • s-maxage — ลบล้างคำสั่ง max-age สำหรับแคชที่แชร์ (เช่น CDN) เมื่อ CDN พบการตอบกลับที่เก่ากว่า s-maxage วินาที CDN จะ ตรวจสอบซ้ำกับเซิร์ฟเวอร์ต้นทาง ในส่วนหัวตัวอย่าง เบราว์เซอร์จะแคชการตอบกลับได้ 5 นาที แต่ CDN และแคชระดับกลางอื่นๆ จะแคชได้ 10 นาที

สําหรับ max-age และ s-maxage ให้ตั้งค่าเป็นระยะเวลาที่นานที่สุด ที่คุณพอใจที่จะให้ผู้ใช้ได้รับเนื้อหาที่ล้าสมัย หากหน้าเว็บมีการเปลี่ยนแปลง ทุกๆ 2-3 วินาที ให้ใช้ค่าเวลาที่น้อย อย่างไรก็ตาม เนื้อหาประเภทอื่นๆ สามารถ แคชได้อย่างปลอดภัยเป็นเวลาหลายชั่วโมง หลายวัน หรือหลายเดือน

หากต้องการป้องกันไม่ให้แคชโดยสิ้นเชิง (เช่น เพื่อแสดงเนื้อหาแบบคงที่เวอร์ชันล่าสุดเสมอ) คุณสามารถกำหนดค่านี้ใน firebase.json โดยใช้การตั้งค่า headers ดังนี้

"hosting": {
  // ...

  // Disables caching for the /posts route
  "headers": [ {
    // Change source to match your dynamically-rendered routes
    "source": "/posts/**",
    "headers": [ {
      "key": "Cache-Control",
      "value": "no-cache, no-store"
    } ]
  } ]
}

ดูข้อมูลเพิ่มเติมเกี่ยวกับส่วนหัว Cache-Control ได้ที่ เครือข่ายนักพัฒนาซอฟต์แวร์ของ Mozilla และในเอกสารประกอบสำหรับนักพัฒนาเว็บของ Google

ระบบจะแสดงเนื้อหาที่แคชไว้เมื่อใด

เบราว์เซอร์และ CDN จะแคชเนื้อหาตามข้อมูลต่อไปนี้

  • ชื่อโฮสต์
  • เส้นทาง
  • สตริงการค้นหา
  • เนื้อหาของส่วนหัวของคำขอที่ระบุในส่วนหัว Vary

ส่วนหัว Vary

ส่วนหัว Vary จะกำหนดว่าควรใช้ส่วนหัวของคำขอใดเพื่อแสดง การตอบกลับที่เหมาะสม (ไม่ว่าเนื้อหาที่แคชไว้จะถูกต้องหรือไม่ หรือควร ตรวจสอบเนื้อหาอีกครั้งกับเซิร์ฟเวอร์ต้นทางหรือไม่)

Firebase Hosting จะตั้งค่าVaryส่วนหัวที่เหมาะสมในคำตอบของคุณโดยอัตโนมัติสำหรับสถานการณ์ทั่วไป โดยส่วนใหญ่แล้ว คุณไม่จำเป็นต้องกังวล เกี่ยวกับส่วนหัว Vary อย่างไรก็ตาม ในกรณีการใช้งานขั้นสูงบางอย่าง คุณอาจมี ส่วนหัวอื่นๆ ที่คุณต้องส่งผลต่อแคช ในกรณีนี้ คุณสามารถตั้งค่าส่วนหัว Vary ในการตอบกลับได้ เช่น

res.set('Vary', 'Accept-Encoding, X-My-Custom-Header');

ในกรณีนี้ ค่าของส่วนหัว Vary คือ

vary: X-My-Custom-Header, x-fh-requested-host, accept-encoding, cookie, authorization

การตั้งค่าเหล่านี้จะทำให้ระบบแคชคำขอ 2 รายการที่เหมือนกันแต่มีส่วนหัว X-My-Custom-Header ต่างกันแยกกัน โปรดทราบว่า Hosting จะเพิ่ม Cookie และ Authorization ลงในส่วนหัว Vary โดยค่าเริ่มต้นเมื่อมีการส่งคำขอ เนื้อหาแบบไดนามิก วิธีนี้จะช่วยให้มั่นใจได้ว่าส่วนหัวการให้สิทธิ์ของเซสชันหรือคุกกี้ ที่คุณใช้จะกลายเป็นส่วนหนึ่งของคีย์แคช ซึ่งจะป้องกันการรั่วไหลของเนื้อหาโดยไม่ตั้งใจ

นอกจากนี้ โปรดทราบว่า

  • แคชได้เฉพาะคำขอ GET และ HEAD ระบบจะไม่แคชคำขอ HTTPS ที่ใช้เมธอดอื่นๆ

  • โปรดระมัดระวังเมื่อเพิ่มการตั้งค่าลงในส่วนหัว Vary ยิ่งเพิ่มการตั้งค่ามากเท่าใด โอกาสที่ CDN จะแสดงเนื้อหาที่แคชก็จะยิ่งน้อยลง นอกจากนี้ โปรดทราบว่า Vary จะอิงตามส่วนหัวของคำขอ ไม่ใช่ส่วนหัวของการตอบกลับ

การใช้คุกกี้

เมื่อใช้ Firebase Hosting ร่วมกับ Cloud Functions หรือ Cloud Run โดยทั่วไปแล้ว ระบบจะนำคุกกี้ออกจากคำขอขาเข้า ซึ่งจำเป็นต่อการอนุญาตให้ ลักษณะการทำงานของแคช CDN มีประสิทธิภาพ เฉพาะคุกกี้ที่ตั้งชื่อเป็นพิเศษ __session เท่านั้นที่ได้รับอนุญาตให้ส่งต่อไปยัง การเรียกใช้แอป

เมื่อมีอยู่ __session คุกกี้จะกลายเป็นส่วนหนึ่งของคีย์แคชโดยอัตโนมัติ ซึ่งหมายความว่าผู้ใช้ 2 คนที่มีคุกกี้ต่างกันจะรับการตอบสนองที่แคชของอีกคนไม่ได้ ใช้คุกกี้ __session ก็ต่อเมื่อแอปแสดงเนื้อหาที่แตกต่างกันโดยขึ้นอยู่กับการให้สิทธิ์ของผู้ใช้