Angular アプリを GitHub Pages に公開する際、ルーティングによる 404 を回避する
Angular に限らずだが、最近の SPA ライブラリでルーティングを使用していると、実際には HTML ページが存在しない /hoge/fuga/
といった URL を生成し、画面遷移を実現しているだろう。
こうした SPA アプリを GitHub Pages に公開した場合、最初は必ず /index.html
を踏んでもらう必要があるが、ルーティングで生成した URL をブックマークされたりすると、ページが存在しない URL に飛んでしまい、404 エラーになってしまう。
コレを回避するための方法が紹介されていたので、拙作の Angular Utilities に取り入れてみた。
独自の 404 ページを用意する
404 エラーを回避するためには、独自の 404 ページを用意し、ココから index.html
に遷移させてやれば良い。
GitHub Pages はルートディレクトリに 404.html
があるとそれを独自の 404 ページとして自動的に利用してくれるので、コレにリダイレクトの meta
要素を書こう。
<meta http-equiv="refresh" content="0;URL=./">
後はこの 404.html
を GitHub Pages にアップしてやれば良いだけ。簡単だ。
ただ、IE は独自に用意した 404 ページの容量が 512 バイトを超えると上手く動かないようなので、404 ページは最低限の実装にしておこう。
拙作の 404 ページの実装は以下のとおり。
踏まれた URL に遷移させ直すには
このリダイレクトだけだと、踏まれた URL に戻ってくれず、必ずアプリのトップページが開くような作りになってしまう。
そこで、404.html
で踏まれた URL を SessionStorage に記録しておき、アプリの初期処理でその SessionStorage に記録されている URL を基に初期表示するページを選定してやる。
<script>
// location.href を SessionStorage に記録しておく
sessionStorage.redirect = location.href;
</script>
<meta http-equiv="refresh" content="0;URL=./">
アプリの初期処理の中で、sessionStorage.redirect
の値を基に、表示したいページを選んでやれば良い、という寸法。
Angular の Guard によるページ遷移制限をかけていたり、ログインページを用意していたりする場合は、踏まれた URL ごとに適切にハンドリングしてやろう。
単純な発想だが、404 ページを利用する方法が思い付かず、目から鱗だった。