Check out what’s new from Firebase@ Google I/O 2021, and join our alpha program for early access to the new Remote Config personalization feature. Learn more

Настроить поведение хостинга

С помощью Firebase Hosting вы можете настроить индивидуальное поведение хостинга для запросов к вашему сайту.

Что вы можете настроить для хостинга?

  • Укажите, какие файлы в локальном каталоге проекта вы хотите развернуть на хостинге Firebase. Узнать, как.

  • Обслуживать настроенную страницу 404 / не найдено. Узнать, как.

  • Настройте 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 указывает файлы, которые следует игнорировать при развертывании. Он может принимать глобусы так же, как 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 / не найдено

По желанию
Вы можете выдать настраиваемую ошибку 404 Not Found когда пользователь пытается получить доступ к несуществующей странице.

Создайте новый файл в public каталоге вашего проекта, назовите его 404.html , затем добавьте в файл свой собственный контент 404 Not Found .

Хостинг Firebase отобразит содержимое этой настраиваемой страницы 404.html если браузер 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, сообщая браузеру, что нужно сделать новый запрос по destination URL.

Поле Описание
redirects
source (рекомендуется)
или regex

Шаблон URL-адреса, который при совпадении с исходным URL-адресом запроса запускает хостинг для применения перенаправления.

destination

Статический URL-адрес, по которому браузер должен сделать новый запрос.

Этот URL-адрес может быть относительным или абсолютным путем.

type

Код ответа HTTPS

  • Используйте тип 301 для «Перемещен навсегда».
  • Используйте тип 302 для «Найдено» (временное перенаправление)

Захват сегментов URL для переадресации

По желанию
Иногда вам может потребоваться захватить определенные сегменты шаблона URL-адреса правила перенаправления ( source или значение regex ), а затем повторно использовать эти сегменты в пути destination правила.

Настроить перезапись

По желанию
Используйте перезапись, чтобы отображать одно и то же содержимое для нескольких URL-адресов. Перезапись особенно полезна при сопоставлении с шаблоном, поскольку вы можете принять любой URL-адрес, соответствующий шаблону, и позволить клиентскому коду решать, что отображать.

Вы также можете использовать перезапись для поддержки приложений, использующих HTML5 pushState для навигации. Когда браузер пытается открыть путь URL-адреса, который соответствует указанному source или regex шаблону URL-адреса, браузеру вместо этого будет предоставлено содержимое файла по destination URL-адресу.

Укажите перезапись 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 Hosting применяет правило перезаписи только в том случае, если файл или каталог не существует по пути URL, который соответствует указанному source или шаблону URL-адреса regex . Когда запрос запускает правило перезаписи, браузер возвращает фактическое содержимое указанного файла destination вместо перенаправления HTTP.

Поле Описание
rewrites
source (рекомендуется)
или regex

Шаблон URL-адреса, который при совпадении с исходным URL-адресом запроса запускает хостинг для применения перезаписи.

destination

Локальный файл, который должен существовать

Этот URL-адрес может быть относительным или абсолютным путем.

Прямые запросы к функции

Вы можете использовать rewrites для обслуживания функции из URL-адреса хостинга Firebase. Следующий пример - это отрывок из обслуживания динамического контента с помощью облачных функций .

Например, чтобы направить все запросы со страницы /bigben на вашем хостинг-сайте для выполнения функции bigben :

"hosting": {
  // ...

  // Directs all requests from the page `/bigben` to execute the `bigben` function
  "rewrites": [ {
    "source": "/bigben",
    "function": "bigben"
  } ]
}

После добавления этого правила перезаписи и развертывания в Firebase (с использованием firebase deploy ) ваша функция станет доступной по следующим URL-адресам:

При перенаправлении запросов к функциям с хостингом поддерживаемые методы HTTP-запроса: GET , POST , HEAD , PUT , DELETE , PATCH и OPTIONS . Другие методы, такие как REPORT или PROFIND , не поддерживаются.

Прямые запросы к контейнеру Cloud Run

Вы можете использовать rewrites для доступа к контейнеру Cloud Run с URL-адреса хостинга Firebase. Следующий пример - это отрывок из обслуживания динамического контента с помощью Cloud Run .

Например, чтобы направить все запросы со страницы /helloworld на вашем хостинг-сайте для запуска и запуска 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-адресам:

При перенаправлении запросов в контейнеры Cloud Run с хостингом поддерживаемые методы HTTP-запроса: GET , POST , HEAD , PUT , DELETE , PATCH и OPTIONS . Другие методы, такие как REPORT или PROFIND , не поддерживаются.

В настоящее время вы можете использовать перезапись Cloud Run с хостингом в следующих регионах:

  • 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

Вы можете использовать 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 (см. Следующие две строки).

key Название заголовка, например Cache-Control
value Значение заголовка, например max-age=7200

Вы можете узнать больше о Cache-Control в разделе Хостинг, который описывает обслуживание динамического контента и размещение микросервисов. Вы также можете узнать больше о заголовках 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-адреса, чтобы удалить косую черту в конце.
  • Если не указано иное, Hosting использует только завершающие слэши для файлов индекса каталогов (например, about/index.html ).

Вот как можно контролировать завершающие косые черты, добавляя атрибут trailingSlash :

"hosting": {
  // ...

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

Атрибут trailingSlash не влияет на перезапись динамического содержимого, обслуживаемого Cloud Functions или Cloud Run.

Сопоставление с шаблоном глобуса

В параметрах конфигурации хостинга Firebase широко используется нотация сопоставления шаблонов glob с extglob, аналогично тому, как Git обрабатывает правила gitignore а Bower обрабатывает правила ignore . Эта вики-страница представляет собой более подробную ссылку, но ниже приведены объяснения примеров, используемых на этой странице:

  • firebase.json - соответствует только файлу firebase.json в корне public каталога.

  • ** - Соответствует любому файлу или папке в произвольном подкаталоге.

  • * - Соответствует только файлам и папкам в корне public каталога.

  • **/.* - соответствует любому файлу, начинающемуся с . (обычно скрытые файлы, например, в папке .git ) в произвольном подкаталоге

  • **/node_modules/** - соответствует любому файлу или папке в произвольном node_modules папки node_modules , которая сама может находиться в произвольном подкаталоге public каталога.

  • **/*.@(jpg|jpeg|gif|png) - соответствует любому файлу в произвольном подкаталоге, который заканчивается ровно одним из следующих .jpg : .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",

  }
}