【2018年版】利用前に知って欲しいFirebase Hostingにできること・できないこと

Firebaseは非常に便利なBaaSです。しかしFirebase Hostingは特にですが、そのシンプルさ故に、通常のレンタルサーバでは当たり前にできることができなかったりします。
この案件にはFirebase Hostingを使ってよいのか、別のサービスを使うべきなのか、レンタルサーバを使うべきなのか、という判断の際に必要だった情報を、QA形式でまとめてみました（2018.08時点の情報です）


## Q. Basic認証やIP制限はできる？
**A.** 機能要件によっては可能です。下記の参考記事ではFunctionsを通して、ベーシック認証やIP制限をかけています。しかし、index.htmlをhostingのrootに配置した場合、静的ファイルが優先的に表示・実行されるHostingの仕様上、「example.com」では制限がかかったように見えますが、「example.com/index.html」ではファイルが見えてしまいます。厳密に対応する場合は制限をかけたいディレクトリを一階層下げる、などのハックが必要です。
また、index.htmlを起点としたSPA([vue-routerのHTML5 History モードなど](https://router.vuejs.org/ja/guide/essentials/history-mode.html))構成の場合、Functionsを通してルーティング処理を行って[basic-auth-connect](https://www.npmjs.com/package/basic-auth-connect)等を使う、といったバックエンド処理が必要になります。

### 参考
* [[Firebase Hosting,Functions] basic認証付きでサイトを公開する](https://www.google.co.jp/search?q=firebase+basic%E8%AA%8D%E8%A8%BC&oq=firebase+basic&aqs=chrome.4.69i57j69i60l3j69i59j35i39.3423j0j4&sourceid=chrome&ie=UTF-8)
* [Firebase HostingにIPでアクセス制限をかける。そして少し妥協する。](https://qiita.com/otakky/items/1363e7b4c706dc9cd096)
* [Is it possible to require a password to access a site hosted on firebase?](https://stackoverflow.com/questions/31323630/is-it-possible-to-require-a-password-to-access-a-site-hosted-on-firebase)

## Q. 独自SSLはつかえるのか？
**A.** 使えません。Firebase Hostingでは自動でSSLが設定されますが、カスタムのSSLを設置することはできません。どうしても使いたい場合は、例えばfirebaseにカスタムドメインは設定せずに外部CDNサービスを通して配信する、といった実装をする必要があります。そんな実装にすると当然見通しも悪くコスパもよろしくないので、オススメはしません。

## Q. functionsとルートディレクトリに置いたSPAファイルとは共存できる？
**A.** できます。例えばbigben配下でfunctionsを実行し、ルートディレクトリでSPAを実行するとした場合、``firebase.json``は以下のように設定します（Vue-routerのヒストリーモードで動作確認）

```json
{
  "hosting": {
    "public": "dist",
    "ignore": [
      "firebase.json",
      "**/.*",
      "**/node_modules/**"
    ],
    "rewrites": [
      {
        "source": "/bigben/**", 
        "function": "bigben"
      },
      {
        "source": "**",
        "destination": "/index.html"
      }
    ]
  }
}
```

## Q. リダイレクトはできる？
**A.** できます。``firebase.json``を編集することで可能です。詳しくは公式ドキュメントを参照してください。

[Hosting 動作をカスタマイズする](https://firebase.google.com/docs/hosting/url-redirects-rewrites?hl=ja)


## Q. URLの正規化（ドメインの統一）は可能？
**A.** Firebase Consoleでその設定を行うことはできません。公式にも問い合わせましたが、割り当てられた初期ドメインを非公開にする術は現状なく、canonicalタグを使った正規化で対処して、という回答をもらいました。ただ、タグを入れるだけでは当然リダイレクトしてくれないので、正確に対応するならhost名から判定して、location.hrefで擬似リダイレクトをする、Functionsを通してリダイレクトをする、などの対策が必要です。

*  [Redirect to Firebase Hosting custom domain (Stack Overflow)](https://stackoverflow.com/questions/34212039/redirect-to-firebase-hosting-custom-domain/34212492#34212492
)

## Q. ページの動的生成は可能？
**A.** 可能です。Functionsを通してページ生成を行います。expressなどのサーバソフトウェアを使うことで簡単に生成できます。

* [Cloud Functions による動的コンテンツの配信](https://firebase.google.com/docs/hosting/functions?hl=ja)
* [【Firebase】Cloud Functions + Express + EJSで動的コンテンツを配信する](https://qiita.com/kingpanda/items/aa9bdef2706857720058)
* [Server side rendering with Vue.js and Firebase Hosting](https://speakerdeck.com/k2wanko/server-side-rendering-with-vue-dot-js-and-firebase-hosting?slide=21)

## Q. deployしたデータを削除・非公開にするには？
**A.** Firebase Consoleで削除できますが、1つしか無いリビビジョンを削除・非公開にすることはできません。最も手早い非公開方法としては以下コマンドを実行することです。

```bash
$ firebase hosting:disable
```
diableを実行することでHostingの設定自体が消えることはありません。deployしたデータのみが消去されます。再度公開したい場合は、再度deployを実行してください。


## Q. FTP/FTPSは使ってアップロードできる？
**A.** 使えません。ファイルのアップロード方法はコマンドのみです。

## Q. deployする際に、deploy先の切り替え（開発・本番環境など）ができる？
**A.** できます。``firebase use``コマンドでプロジェクトのエイリアスを作成し、エイリアスに対してdeployコマンドを実行することで切り替えが可能です。

```bash
# プロジェクトのエイリアスを設定できる。ここでは"stating"と想定
firebase use --add

# staging環境にdeployさせるコマンド
firebase deploy -P staging
```
* [Deploy to multiple environments with Firebase Hosting](https://firebase.googleblog.com/2016/07/deploy-to-multiple-environments-with.html)


## その他参考記事
* [静的サイトホスティングの為のGCS/GAE/Firebase Hosting比較](https://medium.com/google-cloud-jp/静的サイトホスティングの為のgcs-gae-firebase-hosting比較-e7d406609f2e)