Với tính năng Lưu trữ Firebase, bạn có thể định cấu hình hành vi lưu trữ tuỳ chỉnh cho các yêu cầu đến trang web của mình.
Bạn có thể định cấu hình những gì cho mục Lưu trữ?
Chỉ định các tệp trong thư mục dự án cục bộ mà bạn muốn triển khai cho tính năng Lưu trữ Firebase. Tìm hiểu cách thực hiện.
Phân phát trang 404/Không tìm thấy tuỳ chỉnh. Tìm hiểu cách thực hiện.
Thiết lập
redirects
cho các trang mà bạn đã di chuyển hoặc xoá. Tìm hiểu cách thực hiện.Thiết lập
rewrites
cho bất kỳ mục đích nào sau đây:Hiện cùng một nội dung cho nhiều URL. Tìm hiểu cách thực hiện.
Phân phát một hàm hoặc truy cập vào vùng chứa Cloud Run từ URL lưu trữ. Tìm hiểu cách thực hiện: hàm hoặc vùng chứa.
Tạo Đường liên kết động cho miền tuỳ chỉnh. Tìm hiểu cách thực hiện.
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 sẽ xử lý trang và nội dung của trang (xác thực, lưu vào bộ nhớ đệm, mã hoá, v.v.). Tìm hiểu cách thực hiện.Thiết lập tính năng quốc tế hoá (i18n) viết lại để phân phát nội dung cụ thể dựa trên lựa chọn ưu tiên về 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 Lưu trữ ở đâ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
ở gốc thư mục dự án khi bạn chạy lệnh firebase init
.
Bạn có thể xem
ví dụ về cấu hình firebase.json
đầy đủ
(chỉ bao gồm tính năng Lưu trữ Firebase) ở cuối trang này. Xin 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 API REST của máy chủ lưu trữ.
Thứ tự ưu tiên của phản hồi Lưu trữ
Các lựa 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, tính năng Lưu trữ sẽ xác định phản hồi bằng thứ tự ưu tiên sau:
- Không gian tên dành riêng bắt đầu bằng một phân đoạn đường dẫn
/__/*
- Lệnh chuyển hướng đã định cấu hình
- Nội dung tĩnh khớp chính xác
- Tính năng ghi lại đã định cấu hình
- Trang 404 tuỳ chỉnh
- Trang 404 mặc định
Nếu bạn đang sử dụng tính năng viết lại i18n, thì thứ tự ưu tiên xử lý khớp chính xác và 404 sẽ được mở rộng trong phạm vi để phù hợp với "nội dung i18n".
Chỉ định những tệp cần triển khai
Các thuộc tính mặc định – public
và ignore
– có trong tệp firebase.json
mặc định sẽ xác định những tệp trong thư mục dự á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
có dạng như sau:
"hosting": {
"public": "public", // the only required attribute for Hosting
"ignore": [
"firebase.json",
"**/.*",
"**/node_modules/**"
]
}
công khai
Bắt buộc
Thuộc tính public
chỉ định thư mục cần triển khai cho
tính năng Lưu trữ Firebase. Giá trị mặc định là 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à đường dẫn đó tồn tại trong thư mục dự án của bạn.
Sau đây là tên mặc định được chỉ đị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"
// ...
}
bỏ qua
Không bắt buộc
Thuộc tính ignore
chỉ định các tệp cần bỏ qua khi triển khai. Việc này có thể xử lý các khối cầu giống như cách Git xử lý .gitignore
.
Sau đây là các giá trị mặc định để 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
]
}
Tuỳ chỉnh trang 404/Not found
Không bắt buộc
Bạn có thể phân phát lỗi 404 Not Found
tuỳ chỉnh khi người dùng cố gắng truy cập vào 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, đặt tên cho tệp đó là 404.html
, sau đó thêm nội dung 404 Not Found
tuỳ chỉnh vào tệp đó.
Dịch vụ Lưu trữ Firebase sẽ hiển thị nội dung của trang 404.html
tuỳ chỉnh này nếu
một trình duyệt kích hoạt lỗi 404 Not Found
trên miền hoặc miền con của bạn.
Định cấu hình lệnh chuyển hướng
Không bắt buộc
Sử dụng lệnh chuyển hướng URL để ngăn các đường 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 một trình duyệt từ
example.com/team
đến example.com/about.html
.
Chỉ định lệnh chuyển hướng URL bằng cách tạo thuộc tính redirects
chứa một mảng các đối tượng (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 mà, 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 lệnh chuyển hướng đến URL đích đã chỉ định.
Đây là cấu trúc cơ bản của thuộc tính redirects
. Ví dụ này chuyển hướng các yêu cầu đến /foo
bằng cách tạo một yêu cầu mới đến /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 dưới đây.
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 ở đầu mỗi yêu cầu (trước khi trình duyệt xác định liệu tệp hoặc thư mục có tồn tại 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 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
.
Trường | Mô tả | |
---|---|---|
redirects |
||
source (đề xuất) hoặc regex
|
Mẫu URL mà, nếu khớp với URL yêu cầu ban đầu, sẽ kích hoạt tính năng Lưu trữ để áp dụng lệnh chuyển hướng
|
|
destination |
URL tĩnh mà trình duyệt sẽ thực hiện yêu cầu mới URL này có thể là một đường dẫn tương đối hoặc tuyệt đối. |
|
type |
Mã phản hồi HTTPS
|
Ghi lại phân đoạn URL để chuyển hướng
Không bắt buộc
Đôi khi, bạn có thể cần chụp các phân đoạn cụ thể trong 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 dẫn destination
của quy tắc.
Định cấu hình tính năng viết lại
Không bắt buộc
Sử dụng tính năng viết lại để cho thấy cùng một nội dung cho nhiều URL. Bạn sẽ đặc biệt hữu ích khi so khớp mẫu, vì bạn có thể chấp nhận mọi URL khớp với mẫu và cho phép mã phía máy khách quyết định nội dung hiển thị.
Bạn cũng có thể dùng tính năng viết lại để hỗ trợ các ứng dụng 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 regex
được chỉ định, trình duyệt sẽ được cung cấp nội dung của tệp tại URL destination
.
Chỉ định việc viết lại URL bằng cách tạo thuộc tính rewrites
chứa một mảng các đối tượng (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 mà (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 của thuộc tính rewrites
. Ví dụ này phân phát index.html
cho các yêu cầu đến 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 ghi lại, trong đó mỗi quy tắc phải bao gồm các trường trong bảng dưới đây.
Tính năng 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 trong đường dẫn URL khớp với mẫu URL source
hoặc regex
đã chỉ định.
Khi một yêu cầu kích hoạt quy tắc ghi lại, trình duyệt sẽ trả về nội dung thực tế của tệp destination
được chỉ định thay vì lệnh chuyển hướng HTTP.
Trường | Mô tả | |
---|---|---|
rewrites |
||
source (đề xuất) hoặc regex
|
Mẫu URL mà, nếu khớp với URL yêu cầu ban đầu, sẽ kích hoạt tính năng Lưu trữ để áp dụng việc ghi lại
|
|
destination |
Phải có một tệp cục bộ URL này có thể là một đường dẫn tương đối hoặc tuyệt đối. |
Yêu cầu trực tiếp đến một hàm
Bạn có thể sử dụng rewrites
để phân phát hàm từ URL lưu trữ Firebase. Ví dụ sau là phần trích dẫn từ nội dung phân phát nội dung động bằng Cloud Functions.
Ví dụ: để chuyển 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 nhằm thực thi hàm 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)
}
} ]
}
Sau khi thêm quy tắc ghi lại này và triển khai cho Firebase (bằng
firebase deploy
), bạn có thể truy cập hàm của mình thông qua các URL sau:
Các miền con Firebase của bạn:
PROJECT_ID.web.app/bigben
vàPROJECT_ID.firebaseapp.com/bigben
Bất kỳ miền tuỳ chỉnh nào đã kết nối:
CUSTOM_DOMAIN/bigben
Khi chuyển hướng yêu cầu đến các hàm qua tính năng Lưu trữ, các phương thức yêu cầu HTTP được hỗ trợ là GET
, POST
, HEAD
, PUT
, DELETE
, PATCH
và OPTIONS
.
Các phương thức khác như REPORT
hoặc PROFIND
không được hỗ trợ.
Yêu cầu trực tiếp đến một vùng chứa Cloud Run
Bạn có thể sử dụng rewrites
để truy cập vào vùng chứa Cloud Run từ URL lưu trữ Firebase. Ví dụ sau đây là phần trích dẫn từ nội dung phân phát nội dung động bằng Cloud Run.
Ví dụ: để chuyển 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 quá trình khởi động và chạy một thực thể vùng 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 ghi lại này và triển khai cho Firebase (bằng firebase deploy
), bạn có thể truy cập hình ảnh vùng chứa của mình thông qua các URL sau:
Các miền con Firebase của bạn:
PROJECT_ID.web.app/helloworld
vàPROJECT_ID.firebaseapp.com/helloworld
Bất kỳ miền tuỳ chỉnh nào đã kết nối:
CUSTOM_DOMAIN/helloworld
Khi chuyển hướng các yêu cầu đến vùng chứa Cloud Run bằng tính năng Lưu trữ, các phương thức yêu cầu HTTP được hỗ trợ là GET
, POST
, HEAD
, PUT
, DELETE
, PATCH
và OPTIONS
. Các phương thức khác như REPORT
hoặc PROFIND
không được hỗ trợ.
Để đạt được hiệu suất tốt nhất, hãy sắp xếp lại dịch vụ Cloud Run với tính năng Lưu trữ bằng cách sử dụng các khu vực sau:
us-west1
us-central1
us-east1
europe-west1
asia-east1
Các hoạt động ghi lại thành Cloud Run từ tính năng Lưu trữ được hỗ trợ ở các khu vực sau:
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
Tạo đường liên kết động của miền tuỳ chỉnh
Bạn có thể sử dụng rewrites
để tạo Liên kết động cho miền tuỳ chỉnh. Hãy truy cập vào tài liệu về Đường liên kết động để biết thông tin chi tiết về cách thiết lập miền tuỳ chỉnh cho Đường liên kết động.
Chỉ sử dụng miền tuỳ chỉnh của bạn cho Đường 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 miền tuỳ chỉnh để sử dụng cho Đường 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 } ] }
Việc định cấu hình Đường liên kết động trong tệp firebase.json
yêu cầu các yêu cầu sau:
Trường | Mô tả | |
---|---|---|
appAssociation |
Bạn phải đặt thành
|
|
rewrites |
||
source |
Đường dẫn mà bạn muốn sử dụng cho Đường liên kết động Không giống như các quy tắc ghi lại đường dẫn đến URL, quy tắc viết lại cho Đường liên kết động không được chứa biểu thức chính quy. |
|
dynamicLinks |
Bạn phải đặ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ủ truyền thêm thông tin 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 cả chức năng kiểm soát quyền truy cập, xác thực, lưu vào bộ nhớ đệm và mã hoá.
Chỉ định tiêu đề phản hồi tuỳ chỉnh, dành riêng cho tệp bằng cách tạo 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 mà, nếu khớp với đường dẫn URL yêu cầu, sẽ kích hoạt tính năng Lưu trữ để áp dụng các tiêu đề phản hồi tuỳ chỉnh đã chỉ định.
Đây là cấu trúc cơ bản của thuộc tính headers
. Ví dụ này áp dụng tiêu đề CORS cho mọi 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 dưới đây.
Trường | Mô tả | ||
---|---|---|---|
headers |
|||
source (đề xuất) hoặc regex
|
Mẫu URL mà, nếu khớp với URL yêu cầu ban đầu, sẽ kích hoạt tính năng Lưu trữ để áp dụng tiêu đề tuỳ chỉnh
Để tạo tiêu đề cho khớp với trang 404 tuỳ chỉnh, hãy dùng |
||
mảng (sub-)headers |
Những tiêu đề tuỳ chỉnh mà dịch vụ Lưu trữ á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 |
||
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 phân phát nội dung động và các dịch vụ vi mô của việc lưu trữ. Bạn cũng có thể tìm hiểu thêm về tiêu đề CORS.
Kiểm soát .html
tiện ích
Không bắt buộc
Thuộc tính cleanUrls
cho phép bạn kiểm soát việc URL có nên chứa đuôi .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 các URL tệp đã tải lên. Nếu bạn thêm một phần mở rộng .html
vào yêu cầu, thì tính năng Lưu trữ sẽ thực hiện lệnh chuyển hướng 301
đến cùng đường dẫn đó nhưng loại bỏ phần mở rộng .html
.
Sau đây là cách kiểm soát việc đưa .html
vào URL bằng cách thêm thuộc tính cleanUrls
:
"hosting": {
// ...
// Drops `.html` from uploaded URLs
"cleanUrls": true
}
Kiểm soát dấu gạch chéo ở cuối
Không bắt buộc
Thuộc tính trailingSlash
cho phép bạn kiểm soát việc URL nội dung tĩnh có được chứa dấu gạch chéo ở cuối hay không.
- Khi
true
, Dịch vụ lưu trữ chuyển hướng URL để thêm dấu gạch chéo ở cuối. - Khi
false
, tính năng Lưu trữ sẽ chuyển hướng URL để xóa dấu gạch chéo ở cuối. - Khi không chỉ định, tính năng 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 Functions hoặc Cloud Run phân phát.
So khớp mẫu hình cầu
Các tuỳ chọn cấu hình của tính năng Lưu trữ Firebase tận dụng triệt để chú thích so khớp mẫu toàn cầu với định dạng extglob, tương tự như cách Git xử lý các quy tắc gitignore
và Bower xử lý các quy tắc ignore
.
Trang wiki này là tài liệu tham khảo chi tiết hơn, nhưng sau đây là phần giải thích cho các ví dụ được sử dụng trên trang này:
firebase.json
– Chỉ khớp với tệpfirebase.json
trong gốc của thư mụcpublic
**
— Khớp với mọi tệp hoặc thư mục trong thư mục con tuỳ ý*
– Chỉ khớp các tệp và thư mục trong gốc của thư mụcpublic
**/.*
– So khớp mọi tệp 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 tuỳ ý**/node_modules/**
– So khớp mọi tệp hoặc thư mục trong một thư mục con tuỳ ý của thư mụcnode_modules
. Thư mục này có thể nằm trong thư mục con tuỳ ý của thư mụcpublic
**/*.@(jpg|jpeg|gif|png)
– So khớp mọi tệp trong một thư mục con tuỳ ý kết thúc bằng đúng một trong các phần sau:.jpg
,.jpeg
,.gif
hoặc.png
Ví dụ về cấu hình Lưu trữ đầy đủ
Sau đây là ví dụ về cấu hình firebase.json
đầy đủ cho tính năng Lưu trữ Firebase. Xin 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",
}
}