Firebase Hosting firebase.jsonでリダイレクトのキャプチャをする方法

Share on:

この記事は約3 分で読めます。

目次

当ブログはFirebase Hostingにホスティングしていますが、運営上、301リダイレクト(URLパスの変更)を行う必要が発生しました。

Firebase Hostingでは通常のサイトやWordPressなどの.htaccessで行うような処理をfirebase.jsonに記述して処理するようになっています。

単純な301リダイレクトなら、公式ページにあるように、

1"redirects": [ {
2      "source" : "/foo",
3      "destination" : "/bar",
4      "type" : 301
5    } ]

と書けば301リダイレクトを実現できます。

ただ、今回の当ブログのケースでは特定のURLだけ特定のディレクトリ配下に301リダイレクトするというものでした。

この作業を行うにあたり少し悩み、参考になるサイトが無かったので書き留めておきます。

特定のURLを特定のディレクトリ配下に301リダイレクトしたいとは

やりたいことは、

https://hoge.com/hexo-theme-customize/

https://hoge.com/nodejs/hexo-theme-customize/
に、

https://hoge.com/hexo-plugin-customize/

https://hoge.com/nodejs/hexo-plugin-customize/
に、

というように、hexoで始まるタイトルの記事を/nodejs/ディレクトリに301リダイレクトしたいという内容です。

firebase.jsonで特定のディレクトリに記事を301リダイレクトさせる

単純(?)に、

1"redirects": [ {
2      "source" : "/hexo*",
3      "destination" : "/nodejs/",
4      "type" : 301
5    } ]

としても、https://hoge.com/nodejs/にリダイレクトしてしまい、記事URLが引き継がれません。

そこで公式ページにもあるように、リダイレクトのキャプチャという設定を行います。

リダイレクトのキャプチャ

リダイレクトのソース URL の一部を取得し、それらを宛先で再利用するほうが望ましい場合があります。これを行うには、: 接頭辞を使用してセグメントを識別し、名前の後にオプションで * を付けることで、残りの URL をキャプチャする必要があることを示します。
“redirects”: [ {
“source”: “/blog/:post*”,
“destination”: “https://blog.myapp.com/:post*”,
“type”: 301
},
{
“source”: “/users/:id/profile”,
“destination”: “/users/:id/newProfile”,
“type”: 301
} ]

公式の解説どおり、:post:idでURLをキャプチャすることで、リダイレクト先にURLを引き継げます。

では、今回のようにURLの一部が特定の文字にマッチするURLをリダイレクトさせるにはどうしたらいいでしょうか?

それでは解決方法です。

特定の文字にマッチするURLをfirebase.jsonを使って301リダイレクトする方法

解決方法

1"redirects": [ {
2   "source": "/hexo:post*",
3   "destination": "/nodejs/hexo:post*",
4   "type": 301
5 } ]

前述の例で説明すると、hexoで始まり以下:post*でキャプチャしたURLを/nodejs/以下にhexo:post*の内容で301リダイレクトします。

これでマッチするURLだけ特定のディレクトリ以下へ301リダイレクトすることができます。

まとめ

.htaccessや正規表現などと違った書式のため初めは悩みましたが、じっくり考えれば解決しました。

ググってもこの件について触れている記事がなかったため、参考になる人がいれば幸いです。