กำหนดค่าลักษณะการทำงานของโฮสติ้ง

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

คุณสามารถกำหนดค่าอะไรสำหรับโฮสติ้ง

  • ระบุไฟล์ในไดเรกทอรีโปรเจ็กต์ในเครื่องที่คุณต้องการทำให้ใช้งานได้กับโฮสติ้งของ Firebase ดูวิธีการ

  • แสดงหน้า 404/Not Found ที่กำหนดเอง ดูวิธีการ

  • ตั้งค่า redirects สำหรับเพจที่คุณย้ายหรือลบไปแล้ว ดูวิธีการ

  • ตั้งค่า rewrites เพื่อวัตถุประสงค์ต่อไปนี้

    • แสดงเนื้อหาเดียวกันสำหรับ URL หลายรายการ ดูวิธีการ

    • ใช้ฟังก์ชันหรือเข้าถึงคอนเทนเนอร์ Cloud Run จาก URL โฮสติ้ง โปรดดูวิธีการที่หัวข้อฟังก์ชันหรือคอนเทนเนอร์

    • สร้างลิงก์แบบไดนามิกของโดเมนที่กำหนดเอง ดูวิธีการ

  • เพิ่ม headers เพื่อส่งต่อข้อมูลเพิ่มเติมเกี่ยวกับคำขอหรือคำตอบ เช่น วิธีที่เบราว์เซอร์ควรจัดการหน้าเว็บและเนื้อหาในหน้า (การตรวจสอบสิทธิ์ การแคช การเข้ารหัส ฯลฯ) ดูวิธีการ

  • ตั้งค่าการปรับให้เป็นสากล (i18n) เพื่อแสดงเนื้อหาที่เจาะจงตามค่ากำหนดภาษาและ/หรือประเทศของผู้ใช้ ดูวิธีการ (หน้าอื่น)

คุณจะกำหนดค่าโฮสติ้งไว้ที่ใด

โดยกำหนดค่าโฮสติ้งของ Firebase ในไฟล์ firebase.json Firebase จะสร้างไฟล์ firebase.json ขึ้นโดยอัตโนมัติที่รูทของไดเรกทอรีโปรเจ็กต์เมื่อคุณเรียกใช้คำสั่ง firebase init

ดูตัวอย่างการกำหนดค่า firebase.json แบบเต็ม (ครอบคลุมเฉพาะโฮสติ้งของ Firebase) ได้ที่ด้านล่างของหน้านี้ โปรดทราบว่าไฟล์ firebase.json อาจมีการกำหนดค่าสำหรับบริการ Firebase อื่นๆ ด้วย

คุณตรวจสอบเนื้อหา firebase.json ที่ทำให้ใช้งานได้แล้วได้โดยใช้ Hosting REST API

ลำดับความสำคัญของการตอบกลับโฮสติ้ง

ตัวเลือกการกำหนดค่าโฮสติ้งของ Firebase ต่างๆ ที่อธิบายไว้ในหน้านี้อาจทับซ้อนกันในบางครั้ง หากมีข้อขัดแย้ง โฮสติ้งจะกำหนดการตอบกลับโดยใช้ลำดับความสำคัญต่อไปนี้

  1. เนมสเปซที่สงวนไว้ซึ่งขึ้นต้นด้วยกลุ่มเส้นทาง /__/*
  2. การเปลี่ยนเส้นทางที่กำหนดค่าไว้
  3. เนื้อหาคงที่ที่ตรงกันทั้งหมด
  4. กำหนดค่าการเขียนใหม่แล้ว
  5. หน้า 404 ที่กำหนดเอง
  6. หน้า 404 เริ่มต้น

หากคุณใช้การเขียนซ้ำแบบ i18n ลำดับความสำคัญของการจับคู่ที่ตรงกันทั้งหมดและ 404 จะขยายขอบเขตให้รองรับ "เนื้อหา i18n"

ระบุไฟล์ที่จะทำให้ใช้งานได้

แอตทริบิวต์เริ่มต้น — public และ ignore รวมอยู่ในไฟล์ firebase.json เริ่มต้นจะกำหนดไฟล์ในไดเรกทอรีโปรเจ็กต์ที่ควรทำให้ใช้งานได้กับโปรเจ็กต์ Firebase

การกำหนดค่าเริ่มต้นของ hosting ในไฟล์ firebase.json มีลักษณะดังนี้

"hosting": {
  "public": "public",  // the only required attribute for Hosting
  "ignore": [
    "firebase.json",
    "**/.*",
    "**/node_modules/**"
  ]
}

สาธารณะ

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

ชื่อต่อไปนี้คือชื่อที่ระบุเริ่มต้นของไดเรกทอรีที่จะทำให้ใช้งานได้

"hosting": {
  "public": "public"

  // ...
}

คุณสามารถเปลี่ยนค่าเริ่มต้นเป็นไดเรกทอรีที่ต้องการทำให้ใช้งานได้ ดังนี้

"hosting": {
  "public": "dist/app"

  // ...
}

ไม่สนใจ

ไม่บังคับ
แอตทริบิวต์ ignore ระบุไฟล์ที่จะละเว้นเมื่อทำให้ใช้งานได้ คุณอาจใช้ glOB ในลักษณะเดียวกับที่ Git จัดการ .gitignore

ค่าเริ่มต้นที่ไฟล์จะละเว้นมีดังนี้

"hosting": {
  // ...

  "ignore": [
    "firebase.json",  // the Firebase configuration file (the file described on this page)
    "**/.*",  // files with a leading period should be hidden from the system
    "**/node_modules/**"  // contains dependencies used to create your site but not run it
  ]
}

ปรับแต่งหน้า 404/Not Found

ไม่บังคับ
คุณสามารถแสดงข้อผิดพลาด 404 Not Found ที่กำหนดเองเมื่อผู้ใช้พยายามเข้าถึงหน้าเว็บที่ไม่มีอยู่

สร้างไฟล์ใหม่ในไดเรกทอรี public ของโปรเจ็กต์ ตั้งชื่อ 404.html แล้วเพิ่มเนื้อหา 404 Not Found ที่กำหนดเองลงในไฟล์

โฮสติ้งของ Firebase จะแสดงเนื้อหาของหน้าเว็บ 404.html ที่กำหนดเองนี้หากเบราว์เซอร์ทริกเกอร์ข้อผิดพลาด 404 Not Found ในโดเมนหรือโดเมนย่อยของคุณ

กำหนดค่าการเปลี่ยนเส้นทาง

ไม่บังคับ
ใช้การเปลี่ยนเส้นทาง URL เพื่อป้องกันลิงก์เสียหากคุณย้ายหน้าเว็บ หรือทำให้ URL สั้นลง เช่น คุณสามารถเปลี่ยนเส้นทางเบราว์เซอร์จาก example.com/team ไปยัง example.com/about.html

ระบุการเปลี่ยนเส้นทาง URL โดยการสร้างแอตทริบิวต์ redirects ที่มีอาร์เรย์ของออบเจ็กต์ (เรียกว่า "กฎการเปลี่ยนเส้นทาง") ในแต่ละกฎ ให้ระบุรูปแบบ URL ที่หากตรงกับเส้นทาง URL ของคำขอ ระบบจะทริกเกอร์โฮสติ้งให้ตอบสนองด้วยการเปลี่ยนเส้นทางไปยัง URL ปลายทางที่ระบุ

นี่คือโครงสร้างพื้นฐานสำหรับแอตทริบิวต์ redirects ตัวอย่างนี้เปลี่ยนเส้นทางคำขอไปยัง /foo โดยส่งคำขอใหม่ไปยัง /bar

"hosting": {
  // ...

  // Returns a permanent redirect to "/bar" for requests to "/foo" (but not "/foo/**")
  "redirects": [ {
    "source": "/foo",
    "destination": "/bar",
    "type": 301
  } ]
}

แอตทริบิวต์ redirects มีอาร์เรย์ของกฎการเปลี่ยนเส้นทาง โดยกฎแต่ละข้อต้องมีช่องในตารางด้านล่างนี้

โฮสติ้งของ Firebase จะเปรียบเทียบค่า source หรือ regex กับเส้นทาง URL ทั้งหมดเมื่อเริ่มต้นคำขอทุกรายการ (ก่อนที่เบราว์เซอร์จะพิจารณาว่ามีไฟล์หรือโฟลเดอร์อยู่ที่เส้นทางนั้นหรือไม่) หากพบรายการที่ตรงกัน เซิร์ฟเวอร์ต้นทางโฮสติ้งของ Firebase จะส่งการตอบกลับการเปลี่ยนเส้นทาง HTTPS เพื่อบอกเบราว์เซอร์ให้ส่งคำขอใหม่ที่ URL ของ destination

ฟิลด์ คำอธิบาย
redirects
source (แนะนำ)
หรือ regex

รูปแบบ URL ที่หากตรงกับ URL คำขอเริ่มต้นจะทริกเกอร์ให้โฮสติ้งใช้การเปลี่ยนเส้นทาง

destination

URL ที่มีเนื้อหาคงที่ที่เบราว์เซอร์ควรส่งคำขอใหม่

URL นี้อาจเป็นเส้นทางแบบสัมพัทธ์หรือเส้นทางสัมบูรณ์ก็ได้

type

โค้ดตอบกลับ HTTPS

  • ใช้ประเภทของ 301 สำหรับ "ย้ายถาวร"
  • ใช้ประเภท 302 สำหรับ "พบ" (เปลี่ยนเส้นทางชั่วคราว)

บันทึกกลุ่ม URL สำหรับการเปลี่ยนเส้นทาง

ไม่บังคับ
บางครั้งคุณอาจต้องบันทึกกลุ่มที่เจาะจงของรูปแบบ URL ของกฎการเปลี่ยนเส้นทาง (ค่า source หรือ regex) แล้วใช้กลุ่มเหล่านี้ซ้ำในเส้นทาง destination ของกฎ

กำหนดค่าการเขียนใหม่

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

คุณยังใช้การเขียนใหม่เพื่อรองรับแอปที่ใช้ HTML5 pushState สำหรับการนำทางได้ด้วย เมื่อเบราว์เซอร์พยายามเปิดเส้นทาง URL ที่ตรงกับรูปแบบ URL source หรือ regex ที่ระบุ เบราว์เซอร์จะได้รับเนื้อหาของไฟล์ที่ URL ของ destination แทน

ระบุการเขียน URL ใหม่โดยการสร้างแอตทริบิวต์ rewrites ที่มีอาร์เรย์ของออบเจ็กต์ (เรียกว่า "กฎการเขียนใหม่") ในแต่ละกฎ ให้ระบุรูปแบบ URL ที่หากตรงกับเส้นทาง URL ของคำขอ จะทำให้โฮสติ้งตอบสนองเสมือนว่าบริการได้รับ URL ปลายทางที่ระบุ

นี่คือโครงสร้างพื้นฐานสำหรับแอตทริบิวต์ rewrites ตัวอย่างนี้แสดง index.html สำหรับคำขอไปยังไฟล์หรือไดเรกทอรีที่ไม่มีอยู่

"hosting": {
  // ...

  // Serves index.html for requests to files or directories that do not exist
  "rewrites": [ {
    "source": "**",
    "destination": "/index.html"
  } ]
}

แอตทริบิวต์ rewrites มีอาร์เรย์ของกฎการเขียนใหม่ ซึ่งกฎแต่ละข้อต้องมีช่องในตารางด้านล่างนี้

โฮสติ้งของ Firebase จะใช้กฎการเขียนใหม่ก็ต่อเมื่อไฟล์หรือไดเรกทอรีไม่อยู่ในเส้นทาง URL ที่ตรงกับรูปแบบ URL ของ source หรือ regex ที่ระบุเท่านั้น เมื่อคำขอทริกเกอร์กฎการเขียนใหม่ เบราว์เซอร์จะแสดงผลเนื้อหาจริงของไฟล์ destination ที่ระบุแทนการเปลี่ยนเส้นทาง HTTP

ฟิลด์ คำอธิบาย
rewrites
source (แนะนำ)
หรือ regex

รูปแบบ URL ที่หากตรงกับ URL ของคำขอเริ่มต้นจะทริกเกอร์ให้โฮสติ้งใช้การเขียนใหม่

destination

ไฟล์ในเครื่องที่ต้องมี

URL นี้อาจเป็นเส้นทางแบบสัมพัทธ์หรือเส้นทางสัมบูรณ์ก็ได้

ส่งคำขอไปยังฟังก์ชันโดยตรง

คุณสามารถใช้ rewrites เพื่อให้บริการฟังก์ชันจาก URL โฮสติ้งของ Firebase ตัวอย่างต่อไปนี้เป็นตัวอย่างที่ตัดตอนมาจากการแสดงเนื้อหาแบบไดนามิกโดยใช้ Cloud Functions

ตัวอย่างเช่น หากต้องการส่งคำขอทั้งหมดจากหน้า /bigben ในเว็บไซต์โฮสติ้งให้เรียกใช้ฟังก์ชัน bigben ให้ทำดังนี้

"hosting": {
  // ...

  // Directs all requests from the page `/bigben` to execute the `bigben` function
  "rewrites": [ {
    "source": "/bigben",
    "function": {
      "functionId": "bigben",
      "region": "us-central1"  // optional (see note below)
      "pinTag": true           // optional (see note below)
    }
  } ]
}

หลังจากเพิ่มกฎการเขียนใหม่นี้และทำให้ใช้งานได้ใน Firebase (โดยใช้ firebase deploy) ฟังก์ชันจะเข้าถึงได้ผ่าน URL ต่อไปนี้

  • โดเมนย่อยของ Firebase:
    PROJECT_ID.web.app/bigben และ PROJECT_ID.firebaseapp.com/bigben

  • โดเมนที่กำหนดเองที่เชื่อมต่อทั้งหมด:
    CUSTOM_DOMAIN/bigben

เมื่อเปลี่ยนเส้นทางคำขอไปยังฟังก์ชันด้วยโฮสติ้ง เมธอดคำขอ HTTP ที่รองรับคือ GET, POST, HEAD, PUT, DELETE, PATCH และ OPTIONS ระบบไม่รองรับวิธีการอื่นๆ เช่น REPORT หรือ PROFIND

ส่งคำขอโดยตรงไปยังคอนเทนเนอร์ Cloud Run

คุณใช้ rewrites เพื่อเข้าถึงคอนเทนเนอร์ Cloud Run จาก URL โฮสติ้งของ Firebase ได้ ตัวอย่างต่อไปนี้เป็นข้อความที่ตัดตอนมาจากการแสดงเนื้อหาแบบไดนามิกโดยใช้ Cloud Run

ตัวอย่างเช่น หากต้องการส่งคำขอทั้งหมดจากหน้า /helloworld ในเว็บไซต์โฮสติ้งให้ทริกเกอร์การเริ่มต้นและการเรียกใช้อินสแตนซ์คอนเทนเนอร์ helloworld ให้ทำดังนี้

"hosting": {
 // ...

 // Directs all requests from the page `/helloworld` to trigger and run a `helloworld` container
 "rewrites": [ {
   "source": "/helloworld",
   "run": {
     "serviceId": "helloworld",  // "service name" (from when you deployed the container image)
     "region": "us-central1"  // optional (if omitted, default is us-central1)
   }
 } ]
}

หลังจากเพิ่มกฎการเขียนใหม่นี้และทำให้ใช้งานได้ใน Firebase (โดยใช้ firebase deploy) แล้ว คุณจะเข้าถึงอิมเมจคอนเทนเนอร์ได้ผ่าน URL ต่อไปนี้

  • โดเมนย่อยของ Firebase:
    PROJECT_ID.web.app/helloworld และ PROJECT_ID.firebaseapp.com/helloworld

  • โดเมนที่กำหนดเองที่เชื่อมต่อทั้งหมด:
    CUSTOM_DOMAIN/helloworld

เมื่อเปลี่ยนเส้นทางคำขอไปยังคอนเทนเนอร์ Cloud Run ด้วยโฮสติ้ง เมธอดคำขอ HTTP ที่รองรับคือ GET, POST, HEAD, PUT, DELETE, PATCH และ OPTIONS ระบบไม่รองรับวิธีการอื่นๆ เช่น REPORT หรือ PROFIND

เพื่อประสิทธิภาพที่ดีที่สุด โปรดค้นหาบริการ Cloud Run ร่วมกับโฮสติ้งโดยใช้ภูมิภาคต่อไปนี้

  • us-west1
  • us-central1
  • us-east1
  • europe-west1
  • asia-east1

ระบบรองรับการเขียนซ้ำจากโฮสติ้งไปยัง Cloud Run ในภูมิภาคต่อไปนี้

  • asia-east1
  • asia-east2
  • asia-northeast1
  • asia-northeast2
  • asia-northeast3
  • asia-south1
  • asia-south2
  • asia-southeast1
  • asia-southeast2
  • australia-southeast1
  • australia-southeast2
  • europe-central2
  • europe-north1
  • europe-southwest1
  • europe-west1
  • europe-west12
  • europe-west2
  • europe-west3
  • europe-west4
  • europe-west6
  • europe-west8
  • europe-west9
  • me-central1
  • me-west1
  • northamerica-northeast1
  • northamerica-northeast2
  • southamerica-east1
  • southamerica-west1
  • us-central1
  • us-east1
  • us-east4
  • us-east5
  • us-south1
  • us-west1
  • us-west2
  • us-west3
  • us-west4
  • us-west1
  • us-central1
  • us-east1
  • europe-west1
  • asia-east1

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

  • ใช้โดเมนที่กำหนดเองเท่านั้นสำหรับลิงก์แบบไดนามิก

    "hosting": {
      // ...
    
      "appAssociation": "AUTO",  // required for Dynamic Links (default is AUTO if not specified)
    
      // Add the "rewrites" attribute within "hosting"
      "rewrites": [ {
        "source": "/**",  // the Dynamic Links start with "https://CUSTOM_DOMAIN/"
        "dynamicLinks": true
      } ]
    }
    
  • ระบุคำนำหน้าเส้นทางโดเมนที่กำหนดเองที่จะใช้กับลิงก์แบบไดนามิก

    "hosting": {
      // ...
    
      "appAssociation": "AUTO",  // required for Dynamic Links (default is AUTO if not specified)
    
      // Add the "rewrites" attribute within "hosting"
      "rewrites": [ {
        "source": "/promos/**",  // the Dynamic Links start with "https://CUSTOM_DOMAIN/promos/"
        "dynamicLinks": true
      }, {
        "source": "/links/share/**",  // the Dynamic Links start with "https://CUSTOM_DOMAIN/links/share/"
        "dynamicLinks": true
      } ]
    }
    

การกำหนดค่าลิงก์แบบไดนามิกในไฟล์ firebase.json ต้องมีข้อมูลต่อไปนี้

ฟิลด์ คำอธิบาย
appAssociation

ต้องตั้งค่าเป็น AUTO

  • หากไม่ได้ระบุแอตทริบิวต์นี้ในการกำหนดค่า ค่าเริ่มต้นของ appAssociation คือ AUTO
  • การตั้งค่าแอตทริบิวต์นี้เป็น AUTO จะทำให้โฮสติ้งสร้างไฟล์ assetlinks.json และ apple-app-site-association แบบไดนามิกได้เมื่อมีการขอ
rewrites
source

เส้นทางที่คุณต้องการใช้สำหรับลิงก์แบบไดนามิก

การเขียนกฎใหม่สำหรับลิงก์แบบไดนามิกต้องไม่มีนิพจน์ทั่วไป ซึ่งแตกต่างจากกฎที่เขียนเส้นทางไปยัง URL ใหม่

dynamicLinks ต้องตั้งค่าเป็น true

กำหนดค่าส่วนหัว

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

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

นี่คือโครงสร้างพื้นฐานสำหรับแอตทริบิวต์ headers ตัวอย่างนี้ใช้ส่วนหัว CORS สำหรับไฟล์แบบอักษรทั้งหมด

"hosting": {
  // ...

  // Applies a CORS header for all font files
  "headers": [ {
    "source": "**/*.@(eot|otf|ttf|ttc|woff|font.css)",
    "headers": [ {
      "key": "Access-Control-Allow-Origin",
      "value": "*"
    } ]
  } ]
}

แอตทริบิวต์ headers มีอาร์เรย์ของคำจำกัดความ ซึ่งคำจำกัดความแต่ละรายการต้องมีฟิลด์ในตารางด้านล่าง

ฟิลด์ คำอธิบาย
headers
source (แนะนำ)
หรือ regex

รูปแบบ URL ที่หากตรงกับ URL คำขอเริ่มต้นจะทริกเกอร์ให้โฮสติ้งใช้ส่วนหัวที่กำหนดเอง

หากต้องการสร้างส่วนหัวเพื่อจับคู่กับหน้า 404 ที่กำหนดเอง ให้ใช้ 404.html เป็นค่า source หรือ regex

อาร์เรย์ของ (ย่อย)headers

ส่วนหัวที่กำหนดเองซึ่งโฮสติ้งใช้กับเส้นทางคำขอ

ส่วนหัวย่อยแต่ละรายการต้องมีคู่ key และ value (ดู 2 แถวถัดไป)

key ชื่อของส่วนหัว เช่น Cache-Control
value ค่าสำหรับส่วนหัว เช่น max-age=7200

ดูข้อมูลเพิ่มเติมเกี่ยวกับ Cache-Control ในส่วน Hosting ซึ่งอธิบายเกี่ยวกับการแสดงเนื้อหาแบบไดนามิกและการโฮสต์ Microservice ได้ นอกจากนี้ คุณยังดูข้อมูลเพิ่มเติมเกี่ยวกับส่วนหัว CORS ได้อีกด้วย

ควบคุมส่วนขยาย .html รายการ

ไม่บังคับ
แอตทริบิวต์ cleanUrls ช่วยให้คุณควบคุมได้ว่า URL ควรมีส่วนขยาย .html หรือไม่

เมื่อ true โฮสติ้งจะนำส่วนขยาย .html ออกจาก URL ของไฟล์ที่อัปโหลดโดยอัตโนมัติ หากมีการเพิ่มส่วนขยาย .html ในคำขอ โฮสติ้งจะเปลี่ยนเส้นทาง 301 ไปยังเส้นทางเดียวกันแต่จะลบส่วนขยาย .html

วิธีควบคุมการรวม .html ใน URL ด้วยการระบุแอตทริบิวต์ cleanUrls

"hosting": {
  // ...

  // Drops `.html` from uploaded URLs
  "cleanUrls": true
}

ควบคุมเครื่องหมายทับปิดท้าย

ไม่บังคับ
แอตทริบิวต์ trailingSlash ให้คุณควบคุมว่า URL เนื้อหาแบบคงที่ควรมีเครื่องหมายทับปิดท้ายหรือไม่

  • เมื่อ true โฮสติ้งจะเปลี่ยนเส้นทาง URL เพื่อเพิ่มเครื่องหมายทับปิดท้าย
  • เมื่อ false โฮสติ้งจะเปลี่ยนเส้นทาง URL เพื่อนำเครื่องหมายทับปิดท้ายออก
  • เมื่อไม่ระบุ โฮสติ้งจะใช้เฉพาะเครื่องหมายทับปิดท้ายสำหรับไฟล์ดัชนีไดเรกทอรี (เช่น about/index.html)

วิธีควบคุมเครื่องหมายทับปิดท้ายโดยการเพิ่มแอตทริบิวต์ trailingSlash

"hosting": {
  // ...

  // Removes trailing slashes from URLs
  "trailingSlash": false
}

แอตทริบิวต์ trailingSlash ไม่ส่งผลกระทบต่อการเขียนใหม่ไปยังเนื้อหาแบบไดนามิกที่แสดงโดย Cloud Functions หรือ Cloud Run

การจับคู่รูปแบบ Glob

ตัวเลือกการกำหนดค่าโฮสติ้งของ Firebase ใช้ประโยชน์จากเครื่องหมาย การจับคู่รูปแบบ glob กับ extglob อย่างแพร่หลาย ซึ่งคล้ายกับที่ Git จัดการกฎ gitignore และ Bower จัดการกฎ ignore หน้า Wiki นี้เป็นข้อมูลอ้างอิงที่ละเอียดยิ่งขึ้น แต่ต่อไปนี้เป็นคำอธิบายของตัวอย่างที่ใช้ในหน้านี้

  • firebase.json — จับคู่เฉพาะไฟล์ firebase.json ในรูทของไดเรกทอรี public เท่านั้น

  • ** — จับคู่ไฟล์หรือโฟลเดอร์ในไดเรกทอรีย่อยที่กำหนดเอง

  • * — จับคู่เฉพาะไฟล์และโฟลเดอร์ในรูทของไดเรกทอรี public เท่านั้น

  • **/.* — จับคู่ไฟล์ใดก็ตามที่ขึ้นต้นด้วย . (โดยปกติจะเป็นไฟล์ที่ซ่อนไว้ เช่น ในโฟลเดอร์ .git) ในไดเรกทอรีย่อยที่กำหนดเอง

  • **/node_modules/** — จับคู่ไฟล์หรือโฟลเดอร์ใดก็ตามในไดเรกทอรีย่อยที่กำหนดเองของโฟลเดอร์ node_modules ซึ่งอาจอยู่ในไดเรกทอรีย่อยที่กำหนดเองของไดเรกทอรี public

  • **/*.@(jpg|jpeg|gif|png) — จับคู่ไฟล์ใดก็ได้ในไดเรกทอรีย่อยที่กำหนดเองที่ลงท้ายด้วยรายการใดรายการหนึ่งต่อไปนี้ .jpg, .jpeg, .gif หรือ .png

ตัวอย่างการกำหนดค่าโฮสติ้งแบบเต็ม

ต่อไปนี้คือตัวอย่างการกำหนดค่า firebase.json แบบเต็มสำหรับโฮสติ้งของ Firebase โปรดทราบว่าไฟล์ firebase.json อาจมีการกำหนดค่าสำหรับบริการ Firebase อื่นๆ ด้วย

{
  "hosting": {

    "public": "dist/app",  // "public" is the only required attribute for Hosting

    "ignore": [
      "firebase.json",
      "**/.*",
      "**/node_modules/**"
    ],

    "redirects": [ {
      "source": "/foo",
      "destination": "/bar",
      "type": 301
    }, {
      "source": "/firebase/**",
      "destination": "https://www.firebase.com",
      "type": 302
    } ],

    "rewrites": [ {
      // Shows the same content for multiple URLs
      "source": "/app/**",
      "destination": "/app/index.html"
    }, {
      // Configures a custom domain for Dynamic Links
      "source": "/promos/**",
      "dynamicLinks": true
    }, {
      // Directs a request to Cloud Functions
      "source": "/bigben",
      "function": "bigben"
    }, {
      // Directs a request to a Cloud Run containerized app
      "source": "/helloworld",
      "run": {
        "serviceId": "helloworld",
        "region": "us-central1"
      }
    } ],

    "headers": [ {
      "source": "**/*.@(eot|otf|ttf|ttc|woff|font.css)",
      "headers": [ {
        "key": "Access-Control-Allow-Origin",
        "value": "*"
      } ]
    }, {
      "source": "**/*.@(jpg|jpeg|gif|png)",
      "headers": [ {
        "key": "Cache-Control",
        "value": "max-age=7200"
      } ]
    }, {
      "source": "404.html",
      "headers": [ {
        "key": "Cache-Control",
        "value": "max-age=300"
      } ]
    } ],

    "cleanUrls": true,

    "trailingSlash": false,

    // Required to configure custom domains for Dynamic Links
    "appAssociation": "AUTO",

  }
}