了解 2023 年 Google I/O 大会上介绍的 Firebase 亮点。了解详情

Định cấu hình hành vi lưu trữ

Với Lưu trữ Firebase, bạn có thể định cấu hình hành vi lưu trữ tùy chỉnh cho các yêu cầu đối với trang web của mình.

Bạn có thể cấu hình gì cho Hosting?

  • Chỉ định tệp nào trong thư mục dự án cục bộ mà bạn muốn triển khai cho Dịch vụ lưu trữ Firebase. Học như thế nào.

  • Cung cấp trang 404/Không tìm thấy tùy chỉnh. Học như thế nào.

  • Thiết lập redirects cho các trang mà bạn đã di chuyển hoặc xóa. Học như thế nào.

  • Thiết lập rewrites cho bất kỳ mục đích nào sau đây:

  • Thêm headers để chuyển thông tin bổ sung về yêu cầu hoặc phản hồi, chẳng hạn như cách trình duyệt xử lý trang và nội dung của trang (xác thực, bộ nhớ đệm, mã hóa, v.v.). Học như thế nào.

  • Thiết lập tính năng viết lại quốc tế hóa (i18n) để phục vụ nội dung cụ thể dựa trên tùy chọn ngôn ngữ và/hoặc quốc gia của người dùng. Tìm hiểu cách thực hiện (trang khác).

Bạn xác định cấu hình Hosting của mình ở đâu?

Bạn xác định cấu hình Lưu trữ Firebase trong tệp firebase.json . Firebase tự động tạo tệp firebase.json của bạn ở thư mục gốc của thư mục dự án khi bạn chạy lệnh firebase init .

Bạn có thể tìm thấy ví dụ cấu hình firebase.json đầy đủ (chỉ bao gồm Dịch vụ lưu trữ Firebase) ở cuối trang này. Lưu ý rằng tệp firebase.json cũng có thể chứa cấu hình cho các dịch vụ Firebase khác .

Bạn có thể kiểm tra nội dung firebase.json đã triển khai bằng cách sử dụng Hosting REST API .

Thứ tự ưu tiên của phản hồi Hosting

Các tùy chọn cấu hình Lưu trữ Firebase khác nhau được mô tả trên trang này đôi khi có thể trùng lặp. Nếu có xung đột, Hosting sẽ xác định phản hồi của mình theo thứ tự ưu tiên sau:

  1. Không gian tên dành riêng bắt đầu bằng đoạn đường dẫn /__/*
  2. Chuyển hướng được định cấu hình
  3. Đối sánh chính xác nội dung tĩnh
  4. cấu hình viết lại
  5. Trang 404 tùy chỉnh
  6. Trang 404 mặc định

Nếu bạn đang sử dụng i18n rewrites , thứ tự ưu tiên xử lý đối sánh chính xác và 404 sẽ được mở rộng trong phạm vi để phù hợp với "nội dung i18n" của bạn.

Chỉ định tệp nào sẽ triển khai

Các thuộc tính mặc định — publicignore — được bao gồm trong tệp firebase.json mặc định xác định tệp nào trong thư mục dự án của bạn sẽ được triển khai cho dự án Firebase của bạn.

Cấu hình hosting mặc định trong tệp firebase.json trông như thế này:

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

công cộng

Yêu cầu
Thuộc tính public chỉ định thư mục nào sẽ triển khai cho Firebase Hosting. Giá trị mặc định là một thư mục có tên public , nhưng bạn có thể chỉ định đường dẫn của bất kỳ thư mục nào, miễn là nó tồn tại trong thư mục dự án của bạn.

Sau đây là tên được chỉ định mặc định của thư mục để triển khai:

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

  // ...
}

Bạn có thể thay đổi giá trị mặc định thành thư mục mà bạn muốn triển khai:

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

  // ...
}

phớt lờ

Không bắt buộc
Thuộc ignore chỉ định các tệp sẽ bỏ qua khi triển khai. Nó có thể mất các khối giống như cách mà Git xử lý .gitignore .

Sau đây là các giá trị mặc định cho các tệp để bỏ qua:

"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
  ]
}

Tùy chỉnh trang 404/Không tìm thấy

Không bắt buộc
Bạn có thể gặp lỗi 404 Not Found tùy chỉnh khi người dùng cố truy cập một trang không tồn tại.

Tạo một tệp mới trong thư mục public của dự án của bạn, đặt tên là 404.html , sau đó thêm nội dung 404 Not Found tùy chỉnh của bạn vào tệp.

Dịch vụ lưu trữ Firebase sẽ hiển thị nội dung của trang 404.html tùy chỉnh này nếu trình duyệt kích hoạt lỗi 404 Not Found trên miền hoặc miền phụ của bạn.

Định cấu hình chuyển hướng

Không bắt buộc
Sử dụng chuyển hướng URL để ngăn các liên kết bị hỏng nếu bạn đã di chuyển một trang hoặc để rút ngắn URL. Ví dụ: bạn có thể chuyển hướng trình duyệt từ example.com/team sang example.com/about.html .

Chỉ định chuyển hướng URL bằng cách tạo thuộc tính redirects có chứa một mảng đối tượng (được gọi là "quy tắc chuyển hướng"). Trong mỗi quy tắc, hãy chỉ định một mẫu URL, nếu khớp với đường dẫn URL yêu cầu, sẽ kích hoạt Dịch vụ lưu trữ phản hồi bằng một chuyển hướng đến URL đích đã chỉ định.

Đây là cấu trúc cơ bản cho thuộc tính redirects . Ví dụ này chuyển hướng các yêu cầu tới /foo bằng cách tạo một yêu cầu mới tới /bar .

"hosting": {
  // ...

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

Thuộc tính redirects chứa một mảng các quy tắc chuyển hướng, trong đó mỗi quy tắc phải bao gồm các trường trong bảng bên dưới.

Dịch vụ lưu trữ Firebase so sánh giá trị source hoặc regex với tất cả các đường dẫn URL khi bắt đầu mỗi yêu cầu (trước khi trình duyệt xác định xem một tệp hoặc thư mục có tồn tại ở đường dẫn đó hay không). Nếu tìm thấy kết quả trùng khớp, thì máy chủ gốc của Dịch vụ lưu trữ Firebase sẽ gửi phản hồi chuyển hướng HTTPS để yêu cầu trình duyệt thực hiện một yêu cầu mới tại URL destination .

Cánh đồng Sự miêu tả
redirects
source (khuyên dùng)
hoặc regex

Một mẫu URL, nếu khớp với URL yêu cầu ban đầu, sẽ kích hoạt Dịch vụ lưu trữ áp dụng chuyển hướng

destination

Một URL tĩnh nơi trình duyệt sẽ tạo một yêu cầu mới

URL này có thể là đường dẫn tương đối hoặc tuyệt đối.

type

Mã phản hồi HTTPS

  • Sử dụng loại 301 cho 'Đã di chuyển vĩnh viễn'
  • Sử dụng loại 302 cho 'Đã tìm thấy' (Chuyển hướng tạm thời)

Nắm bắt các phân đoạn URL để chuyển hướng

Không bắt buộc
Đôi khi, bạn có thể cần nắm bắt các phân đoạn cụ thể của mẫu URL của quy tắc chuyển hướng ( giá trị source hoặc regex ), sau đó sử dụng lại các phân đoạn này trong đường destination của quy tắc.

Cấu hình viết lại

Không bắt buộc
Sử dụng viết lại để hiển thị cùng một nội dung cho nhiều URL. Viết lại đặc biệt hữu ích với khớp mẫu, vì bạn có thể chấp nhận bất kỳ URL nào khớp với mẫu và để mã phía máy khách quyết định nội dung sẽ hiển thị.

Bạn cũng có thể sử dụng các bản viết lại để hỗ trợ các ứng dụng sử dụng HTML5 pushState để điều hướng. Khi một trình duyệt cố gắng mở một đường dẫn URL khớp với mẫu URL source hoặc URL biểu thức regex đã chỉ định, thay vào đó, trình duyệt sẽ được cung cấp nội dung của tệp tại URL destination .

Chỉ định viết lại URL bằng cách tạo thuộc tính rewrites có chứa một mảng đối tượng (được gọi là "quy tắc viết lại"). Trong mỗi quy tắc, hãy chỉ định một mẫu URL, nếu khớp với đường dẫn URL yêu cầu, sẽ kích hoạt Dịch vụ lưu trữ phản hồi như thể dịch vụ được cung cấp URL đích đã chỉ định.

Đây là cấu trúc cơ bản cho thuộc tính rewrites . Ví dụ này phục vụ index.html cho các yêu cầu đối với tệp hoặc thư mục không tồn tại.

"hosting": {
  // ...

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

Thuộc tính rewrites chứa một mảng các quy tắc viết lại, trong đó mỗi quy tắc phải bao gồm các trường trong bảng bên dưới.

Dịch vụ lưu trữ Firebase chỉ áp dụng quy tắc ghi lại nếu tệp hoặc thư mục không tồn tại ở đường dẫn URL khớp với mẫu URL biểu thức chính quy hoặc source regex chỉ định. Khi một yêu cầu kích hoạt quy tắc viết lại, trình duyệt sẽ trả về nội dung thực của tệp destination đã chỉ định thay vì chuyển hướng HTTP.

Cánh đồng Sự miêu tả
rewrites
source (khuyên dùng)
hoặc regex

Một mẫu URL, nếu khớp với URL yêu cầu ban đầu, sẽ kích hoạt Dịch vụ lưu trữ áp dụng viết lại

destination

Một tệp cục bộ phải tồn tại

URL này có thể là đường dẫn tương đối hoặc tuyệt đối.

Yêu cầu trực tiếp đến một chức năng

Bạn có thể sử dụng rewrites để phục vụ một chức năng từ URL Lưu trữ Firebase. Ví dụ sau đây là một đoạn trích từ việc cung cấp nội dung động bằng Chức năng đám mây .

Ví dụ: để hướng tất cả các yêu cầu từ trang /bigben trên Trang web lưu trữ của bạn để thực thi chức năng bigben :

"hosting": {
  // ...

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

Sau khi thêm quy tắc viết lại này và triển khai lên Firebase (sử dụng firebase deploy ), chức năng của bạn có thể truy cập được qua các URL sau:

  • Tên miền phụ Firebase của bạn:
    PROJECT_ID .web.app/bigbenPROJECT_ID .firebaseapp.com/bigben

  • Mọi miền tùy chỉnh được kết nối :
    CUSTOM_DOMAIN /bigben

Khi chuyển hướng yêu cầu đến các chức năng với Hosting, các phương thức yêu cầu HTTP được hỗ trợ là GET , POST , HEAD , PUT , DELETE , PATCHOPTIONS . Các phương pháp khác như REPORT hoặc PROFIND không được hỗ trợ.

Gửi yêu cầu trực tiếp tới bộ chứa Cloud Run

Bạn có thể sử dụng rewrites để truy cập bộ chứa Cloud Run từ URL Lưu trữ Firebase. Ví dụ sau đây là một đoạn trích từ việc cung cấp nội dung động bằng Cloud Run .

Ví dụ: để hướng tất cả các yêu cầu từ trang /helloworld trên Trang web lưu trữ của bạn để kích hoạt khởi động và chạy phiên bản bộ chứa 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)
   }
 } ]
}

Sau khi thêm quy tắc viết lại này và triển khai vào Firebase (sử dụng firebase deploy ), hình ảnh vùng chứa của bạn có thể truy cập được qua các URL sau:

  • Tên miền phụ Firebase của bạn:
    PROJECT_ID .web.app/helloworldPROJECT_ID .firebaseapp.com/helloworld

  • Mọi miền tùy chỉnh được kết nối :
    CUSTOM_DOMAIN /helloworld

Khi chuyển hướng yêu cầu tới bộ chứa Cloud Run bằng Dịch vụ lưu trữ, các phương thức yêu cầu HTTP được hỗ trợ là GET , POST , HEAD , PUT , DELETE , PATCHOPTIONS . Các phương pháp khác như REPORT hoặc PROFIND không được hỗ trợ.

Hiện tại, bạn có thể sử dụng các bản ghi lại Cloud Run với Hosting ở các khu vực sau:

  • asia-east1
  • asia-east2
  • asia-northeast1
  • asia-northeast2
  • asia-northeast3
  • asia-south1
  • asia-southeast1
  • asia-southeast2
  • australia-southeast1
  • europe-north1
  • europe-west1
  • europe-west2
  • europe-west3
  • europe-west4
  • europe-west6
  • northamerica-northeast1
  • southamerica-east1
  • us-central1
  • us-east1
  • us-east4
  • us-west1

Bạn có thể sử dụng rewrites để tạo Liên kết động miền tùy chỉnh. Truy cập tài liệu Liên kết động để biết thông tin chi tiết về cách thiết lập miền tùy chỉnh cho Liên kết động .

  • Chỉ sử dụng miền tùy chỉnh của bạn cho Liên kết động

    "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
      } ]
    }
    
  • Chỉ định tiền tố đường dẫn tên miền tùy chỉnh để sử dụng cho Liên kết động

    "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
      } ]
    }
    

Định cấu hình Liên kết động trong tệp firebase.json của bạn yêu cầu như sau:

Cánh đồng Sự miêu tả
appAssociation

Phải được đặt thành AUTO

  • Nếu bạn không bao gồm thuộc tính này trong cấu hình của mình, mặc định cho appAssociationAUTO .
  • Bằng cách đặt thuộc tính này thành AUTO , Dịch vụ lưu trữ có thể tự động tạo các tệp assetlinks.jsonapple-app-site-association khi chúng được yêu cầu.
rewrites
source

Đường dẫn mà bạn muốn sử dụng cho Liên kết động

Không giống như các quy tắc viết lại đường dẫn tới URL, các quy tắc viết lại cho Liên kết động không thể chứa các biểu thức chính quy.

dynamicLinks Phải được đặt thành true

Định cấu hình tiêu đề

Không bắt buộc
Tiêu đề cho phép máy khách và máy chủ chuyển thông tin bổ sung cùng với yêu cầu hoặc phản hồi. Một số bộ tiêu đề có thể ảnh hưởng đến cách trình duyệt xử lý trang và nội dung của trang, bao gồm kiểm soát truy cập, xác thực, lưu vào bộ nhớ đệm và mã hóa.

Chỉ định các tiêu đề phản hồi tùy chỉnh, dành riêng cho tệp bằng cách tạo một thuộc tính headers chứa một mảng các đối tượng tiêu đề. Trong mỗi đối tượng, hãy chỉ định một mẫu URL, nếu khớp với đường dẫn URL yêu cầu, sẽ kích hoạt Dịch vụ lưu trữ áp dụng các tiêu đề phản hồi tùy chỉnh đã chỉ định.

Đây là cấu trúc cơ bản cho thuộc tính headers . Ví dụ này áp dụng tiêu đề CORS cho tất cả các tệp phông chữ.

"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": "*"
    } ]
  } ]
}

Thuộc tính headers chứa một mảng các định nghĩa, trong đó mỗi định nghĩa phải bao gồm các trường trong bảng bên dưới.

Cánh đồng Sự miêu tả
headers
source (khuyên dùng)
hoặc regex

Một mẫu URL, nếu khớp với URL yêu cầu ban đầu, sẽ kích hoạt Dịch vụ lưu trữ áp dụng tiêu đề tùy chỉnh

Để tạo tiêu đề khớp với trang 404 tùy chỉnh của bạn , hãy sử dụng 404.html làm giá trị source hoặc regex của bạn.

headers (phụ)

Các tiêu đề tùy chỉnh mà Hosting áp dụng cho đường dẫn yêu cầu

Mỗi tiêu đề phụ phải bao gồm một cặp keyvalue (xem hai hàng tiếp theo).

key Tên của tiêu đề, ví dụ Cache-Control
value Giá trị cho tiêu đề, ví dụ max-age=7200

Bạn có thể tìm hiểu thêm về Cache-Control trong phần Lưu trữ mô tả việc cung cấp nội dung động và lưu trữ vi dịch vụ. Bạn cũng có thể tìm hiểu thêm về tiêu đề CORS .

Kiểm soát tiện ích mở rộng .html

Không bắt buộc
Thuộc tính cleanUrls cho phép bạn kiểm soát xem các URL có nên bao gồm phần mở rộng .html hay không.

Khi true , Dịch vụ lưu trữ sẽ tự động loại bỏ phần mở rộng .html khỏi URL của tệp đã tải lên. Nếu một phần mở rộng .html được thêm vào trong yêu cầu, Dịch vụ lưu trữ sẽ thực hiện chuyển hướng 301 đến cùng một đường dẫn nhưng loại bỏ phần mở rộng .html .

Dưới đây là cách kiểm soát việc bao gồm .html trong URL bằng cách bao gồm thuộc tính cleanUrls :

"hosting": {
  // ...

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

Kiểm soát dấu gạch chéo

Không bắt buộc
Thuộc tính trailingSlash cho phép bạn kiểm soát xem các URL nội dung tĩnh có nên bao gồm dấu gạch chéo ở cuối hay không.

  • Khi true , Dịch vụ lưu trữ sẽ chuyển hướng URL để thêm dấu gạch chéo ở cuối.
  • Khi false , Dịch vụ lưu trữ sẽ chuyển hướng URL để xóa dấu gạch chéo ở cuối.
  • Khi không được chỉ định, Dịch vụ lưu trữ chỉ sử dụng dấu gạch chéo ở cuối cho các tệp chỉ mục thư mục (ví dụ: about/index.html ).

Dưới đây là cách kiểm soát dấu gạch chéo ở cuối bằng cách thêm thuộc tính trailingSlash :

"hosting": {
  // ...

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

Thuộc tính trailingSlash không ảnh hưởng đến việc ghi lại nội dung động do Cloud Function hoặc Cloud Run cung cấp.

Kết hợp mẫu hình cầu

Các tùy chọn cấu hình Lưu trữ Firebase sử dụng rộng rãi ký hiệu đối sánh mẫu hình cầu với extglob, tương tự như cách Git xử lý các quy tắc gitignoreBower xử lý các quy tắc ignore . Trang wiki này là một tài liệu tham khảo chi tiết hơn, nhưng sau đây là giải thích về các ví dụ được sử dụng trên trang này:

  • firebase.json — Chỉ khớp với tệp firebase.json trong thư mục gốc của thư mục public

  • ** — So khớp bất kỳ tệp hoặc thư mục nào trong thư mục con tùy ý

  • * — Chỉ khớp với các tệp và thư mục trong thư mục gốc của thư mục public

  • **/.* — So khớp bất kỳ tệp nào bắt đầu bằng . (thường là các tệp ẩn, như trong thư mục .git ) trong một thư mục con tùy ý

  • **/node_modules/** — So khớp với bất kỳ tệp hoặc thư mục nào trong thư mục con tùy ý của thư mục node_modules , bản thân thư mục này có thể nằm trong thư mục con tùy ý của thư mục public

  • **/*.@(jpg|jpeg|gif|png) — So khớp bất kỳ tệp nào trong thư mục con tùy ý kết thúc bằng chính xác một trong các tệp sau: .jpg , .jpeg , .gif hoặc .png

Ví dụ cấu hình Full Hosting

Sau đây là ví dụ cấu hình firebase.json đầy đủ cho Lưu trữ Firebase. Lưu ý rằng tệp firebase.json cũng có thể chứa cấu hình cho các dịch vụ Firebase khác .

{
  "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",

  }
}