エラーカスタムページ
致命的なエラーや例外が発生した際に、サポート問い合わせ用のUUID追跡機能付きのユーザーフレンドリーなページを表示します。
error_page
インストール
composer require 'drupal/error_page:^2.0'
概要
Error custom pagesモジュールは、例外や致命的なエラーが発生した際に、Drupal coreの素朴なエラーページをカスタマイズ可能なユーザーフレンドリーなページに置き換えます。各エラーにはUUID(Universally Unique Identifier)がタグ付けされ、ユーザーがサポートに連絡する際に特定のエラーを参照できます。UUIDはDrupalのwatchdogとPHPエラーログにも記録され、簡単にデバッグできます。
一般的なDrupalモジュールとは異なり、このモジュールはDrupalの設定管理システムの代わりにsettings.phpを使用して設定を行います。この設計は意図的なものです:キャッチされない例外が発生した場合、Drupalのサービス(設定ファクトリを含む)が利用できない可能性があります。settings.phpに依存することで、Drupalコンテナが壊れているか利用できない場合でも、モジュールは機能し続けることができます。
このモジュールは、エラーページとメッセージ用のカスタマイズ可能なHTMLテンプレートを提供します。Twigレンダリングエンジンは Drupalサービスを必要とするため、モジュールは変数トークン置換を伴うシンプルな静的HTMLファイルを使用します。これらのテンプレートは、パブリックWebアクセスから保護しながらコピーしてカスタマイズできます。
Features
- 例外や致命的なエラーが発生した際に、Drupal coreの素朴なエラー出力の代わりにユーザーフレンドリーなエラーページを表示
- 各エラー/例外に対して一意のUUIDを生成し、ユーザーに表示してサポート参照用にログに記録
- エラーページ(error_page.html)とエラーメッセージ(error_message.html)用のカスタマイズ可能なHTMLテンプレートを提供
- UUID参照付きでDrupalのデータベースログ(watchdog)とPHPエラーログの両方にエラーを記録
- Drupalサービスが利用できない場合でも機能を確保するために、Drupal設定システムの代わりにsettings.php設定を使用
- PHPのerror_log()関数設定を介したカスタムエラーログ出力先をサポート
- .htaccessセキュリティルールでマークアップテンプレートをパブリックアクセスから保護
- Drupal 10およびDrupal 11と互換性あり
Use Cases
本番サイトのエラーハンドリング
本番サイトでDrupalの技術的なエラーメッセージをユーザーフレンドリーなページに置き換えます。ユーザーにはサポートに連絡する際に参照できるUUID付きの丁寧なメッセージが表示され、開発者はログでUUIDを検索して正確なエラー詳細を見つけることができます。
サポートチケットの関連付け
ユーザーがヘルプデスクにエラーを報告する際、エラーページに表示されたUUIDを提供できます。サポートスタッフはそのUUIDでDrupalのデータベースログ(dblog)またはPHPエラーログを検索し、正確なエラー、スタックトレース、コンテキストを素早く特定できます。
ブランド化されたエラーページ
エラーページテンプレートをサイトのブランディングに合わせてカスタマイズできます。error_page.htmlとerror_message.htmlを安全なディレクトリにコピーし、サイトのロゴ、CSS、メッセージを追加して、template_dir設定でカスタムテンプレートを使用するように設定します。
カスタムエラーログ出力先
監視や外部ログシステムとの統合のために、エラーログを特定のファイルにルーティングします。ログメソッド3と出力先パスを設定して、すべてのエラーを専用のログファイルに収集します。
Tips
- カスタムテンプレートはWebルートの外に配置するか、.htaccessで保護して直接的なパブリックアクセスを防止してください
- 開発中は詳細なエラーログを使用して($config['system.logging']['error_level'] = 'verbose')、エラーページで完全なバックトレースを確認できます
- テンプレートの{{ error_report }}変数は、Drupalのログ設定でエラー表示が無効になっている場合は空になります
- error_page_testサブモジュールを有効化して($settings['extension_discovery_scan_tests'] = TRUEが必要)、/error_page_test/exception、/error_page_test/fatal_error、/error_page_test/user_error、/error_page_test/php_noticeで異なるエラータイプをテストできます
- このモジュールは冗長性のために、重大なエラーをDrupalのデータベースログとPHPのエラーログの両方に記録します
Technical Details
Troubleshooting 4
settings.phpファイルにset_error_handler()とset_exception_handler()の両方の呼び出しを追加していることを確認してください。このモジュールはsettings.phpでエラーハンドラを明示的に登録する必要があります。
Composerによるオートローディングを使用していない場合は、settings.phpのset_error_handler呼び出しの前にこの行を追加してください: require_once 'modules/contrib/error_page/src/ErrorPageErrorHandler.php'; Composerユーザーはclassmapオートロードエントリによってこれが自動的に行われます。
settings.phpで$settings['error_page']['uuid']が明示的にFALSEに設定されていないことを確認してください。デフォルトはTRUEですが、無効化されている可能性があります。
$settings['error_page']['template_dir']が正しいディレクトリを指していること、およびテンプレートファイルが正確にerror_page.htmlとerror_message.htmlという名前であることを確認してください。ディレクトリパスは絶対パスまたはDRUPAL_ROOTからの相対パスである必要があります。
Security Notes 4
- 本番サイトでは$settings['extension_discovery_scan_tests']を有効にしないでください。テストモジュールの検出が許可されてしまいます
- カスタムテンプレートディレクトリは、.htaccessを使用するかWebルートの外に配置して、パブリックWebアクセスから保護する必要があります
- このモジュールはフルパス開示を防ぐために、エラーメッセージ内のファイルパスからDRUPAL_ROOTを自動的に削除します(OWASPセキュリティベストプラクティス)
- デフォルトのmarkup/ディレクトリには、テンプレートファイルへのすべてのパブリックアクセスを拒否する.htaccessファイルが含まれています