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

С помощью 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 содержимого с помощью хостинга 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 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 для «Найдено» (Temporary Redirect)

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

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

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

Вы можете использовать rewrites для доступа контейнера Облако Run от хостинга URL Firebase. В следующем примере выдержка из обслуживания содержимого динамического используя Облако 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 ), ваш контейнер изображения доступны по следующим адресам:

  • Ваши поддомены 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 с хостингом в следующих регионах:

  • 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 для создания пользовательских доменов Dynamic Links. Посетите документацию Dynamic Ссылки Подробные сведения о настройке пользовательского домена для динамических ссылок .

  • Используйте свой собственный домен только для динамических ссылок

    "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 в разделе Хостинг, описывающее служащей содержание динамического и хостинг microservices. Вы также можете узнать больше о CORS заголовки.

Control .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 Run.

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

Параметры настройки хостинга Firebase широко использовать Глоб шаблон согласования обозначений с extglob, аналогично тому , как Git ручки gitignore правила и Бауэр ручки ignore правила. Эта вики страница является более подробным руководством, но следующие пояснения примеров , используемых на этой странице:

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

  }
}