エラーページ
最終更新日 2023年06月14日(水)
Table of Contents
アプリにシステムレベルのエラーが発生したときや、メンテナンスモードが有効な間は、Heroku の HTTP ルーターは、HTTP ステータスコード 503 (サービス使用不可) で、スタイルなし HTML を表示します。
アプリケーションエラー (404 や 500) などの他のエラーは、アプリケーションのエラーページを表示しますが、Heroku エラーページは表示しません。無応答や不正な形式の応答が生じるシステムレベルのエラーの場合にのみ、ここで説明する Heroku エラーページが表示されます。
デバッグ
ログは、Heroku エラーページが表示されたとユーザーから報告されたときに、最初に確認するところです。heroku logs
コマンドを使用して、アプリケーションの統一されたイベントストリームと、アプリケーションをサポートする Heroku プラットフォームコンポーネントの状態を表示します。
$ heroku logs
2011-03-01T16:16:29-08:00 heroku[web.1]: State changed from starting to crashed
2011-03-01T16:16:59-08:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path=/ host=example-app-1234567890ab.herokuapp.com fwd=17.17.17.17 dyno= connect= service= status=503 bytes=
この例では、ルーターはアプリのページを表示しようとしましたが、Web プロセスがクラッシュします。Error H10
ログエントリには、この特定の問題の原因を識別するエラーコード H10
が含まれます。エラーコードの完全なリストを参照して、表示されたエラーの原因を特定します。
エラーページが生成される可能性のあるエラーの追求の詳細については、ログ記録に関する記事を参照してください。 さらにデバッグする必要がある場合は、dyno へ SSH で通信する方法を参照してください。
ページのカスタマイズ
アプリケーションにシステムエラーが発生したり、アプリケーションがメンテナンス状態になったときにユーザーに表示されるページは、カスタマイズできます。これらのページをカスタマイズすることで、ユーザーに表示される UI の整合性を高められます。
カスタムページの作成および保存
静的 HTML としてカスタムページを作成します。 テンプレートとして Heroku から提供されているデフォルトの HTML を使用できます。
- https://www.herokucdn.com/error-pages/application-error.html
- https://www.herokucdn.com/error-pages/no-such-app.html
- https://www.herokucdn.com/error-pages/maintenance-mode.html
- https://www.herokucdn.com/error-pages/ssl-cert-error.html
相対パス (<img src="error.png">
など) を使用し、他のアセットを HTML と同じ場所にアップロードする限り、HTML から画像や CSS を参照できます。
Web ページを表示できる場所ならどこでもページを提供できます。Amazon S3 にアップロードすることをお勧めします。S3 を使用する場合は、忘れずに HTML とすべてのアセットをインターネットから読めるように設定してください。
IFrame でのセキュリティ設定により、カスタムエラーページのリンクは、HTML で「target=_blank」を指定しないと、機能しない場合があります。
アプリケーションの設定
ERROR_PAGE_URL
と MAINTENANCE_PAGE_URL
環境設定を、カスタムページ内のインターネットからアクセスできる URL に設定します。
$ heroku config:set \
ERROR_PAGE_URL=//s3.amazonaws.com/<your_bucket>/your_error_page.html \
MAINTENANCE_PAGE_URL=//s3.amazonaws.com/<your_bucket>/your_maintenance_page.html
テスト
メンテナンスページをテストするには、次のように入力します。
$ heroku maintenance:on
$ heroku open
カスタムページが提供され、アプリケーションログには、メンテナンスページがユーザーに提供されたことを示す、その Web ヒットに関する H80 コードが表示されます。
$ heroku logs -p router -n 1
2010-10-08T17:44:18-07:00 heroku[router]: at=info code=H80 desc="Maintenance mode" method=GET path=/ host=example-app-1234567890ab.herokuapp.com fwd=17.17.17.17 dyno= connect= service= status=503 bytes=
エラーページをテストするには、構文エラーをキー設定ファイルに含めたり、35 秒間スリープしているアプリにパスを作成する (したがって、H12 Request Timeout (リクエストタイムアウト) エラーをトリガーする) などの不適切なデプロイをプッシュできます。 次のようなログが表示されている間、このようなエラーのあるアプリまたはパスにアクセスします。
$ heroku logs --tail
2010-10-08T18:04:40-07:00 app[web.1]: Sleeping 35 seconds before I serve this page
2010-10-08T18:05:10-07:00 heroku[router]: at=error code=H12 desc="Request timeout" method=GET path=/ host=example-app-1234567890ab.herokuapp.com fwd=17.17.17.17 dyno=web.1 connect=6ms service=30001ms status=503 bytes=0
2010-10-08T18:05:15-07:00 app[web.1]: Done sleeping
カスタムエラーページがブラウザに表示されます。
SSL
もしもサイトに SSL でアクセスされているにもかかわらず、メンテナンスおよびエラーページ側で HTTPS URL を利用していない場合は、一部のブラウザで警告またはエラーが表示されます。必ず、一致したアプリケーションとエラーページプロトコルを使用してください。