Rabbit Hole
エンティティの正規ページの動作を制御し、コンテンツを表示する代わりにリダイレクト、アクセス拒否、または404レスポンスを返すことができます。
rabbit_hole
インストール
composer require 'drupal/rabbit_hole:8.x-1.0'
概要
Rabbit Holeは、エンティティが自身のページ(正規URL)で表示される際の動作を制御する機能を追加します。これは、Viewsのソースとしてのみ使用されるノードや、単独で表示されるべきではないパラグラフなど、直接アクセスされるべきではないエンティティに有用です。
このモジュールは4つの組み込み動作を提供します:ページの通常表示、403アクセス拒否レスポンスの返却、404ページが見つかりませんレスポンスの返却、または設定可能なHTTPレスポンスコードによる別URLへのリダイレクト。Tokenサポートにより、エンティティのフィールド値に基づいた動的なリダイレクト先を設定できます。
設定はエンティティタイプレベル、バンドルレベル、または個別エンティティごとにオーバーライドできます。権限システムにより、管理者が動作を設定しながら、特定のユーザーが制限をバイパスして通常通りページを表示することを許可できます。
このモジュールは、4つの組み込みオプション以外のカスタム動作を開発者が作成できるプラグインアーキテクチャを使用しています。すべての動作は、エンティティの正規ルートへのカーネルリクエストをインターセプトするイベントサブスクライバーを通じて呼び出されます。
Features
- 正規リンクテンプレートを持つすべてのコンテンツエンティティタイプの正規ページ動作を制御
- 4つの組み込み動作:ページ表示、アクセス拒否(403)、ページが見つかりません(404)、ページリダイレクト
- ページリダイレクトは設定可能なHTTPレスポンスコード(301、302、303、304、305、307)をサポート
- エンティティフィールド値に基づく動的な宛先のためのリダイレクトパスでのTokenサポート
- リダイレクトパスが無効または空の場合のフォールバック動作設定
- エンティティタイプ別、バンドル別、エンティティ別のオーバーライド設定
- 管理者が制限されたページを表示できる権限ベースのバイパス
- 設定されたアクションをバイパスするユーザーへのオプションの警告メッセージ表示
- カスタム動作プラグインを作成するためのプラグインアーキテクチャ
- 正規エンティティルートに対するkernel.requestおよびkernel.responseイベントをインターセプトするイベントサブスクライバー
- 動作値とレスポンスをプログラムで変更するためのalterフック
- バンドルレベル設定のための設定エンティティストレージ
- エンティティごとのオーバーライド設定を保存するためのカスタムフィールドタイプ
- エンティティごとの設定の翻訳サポート
Use Cases
Viewsソースとしてのみ使用されるランディングページノードを非表示にする
ノードをViewsのデータソースとして使用する場合(例:スライドショーを構成する「スライド」コンテンツタイプ)、個別のノードページには有用なコンテンツがありません。これらのコンテンツタイプに対して「ページが見つかりません」または「ページリダイレクト」動作でRabbit Holeを設定し、ユーザーが意味のないページにアクセスするのを防ぎながら、ノードはViewsで使用可能な状態を維持できます。
製品ページをカテゴリ一覧にリダイレクトする
個別の製品ページに直接アクセスされるべきではないECサイトでは、[node:field_category:entity:url]のようなTokenを使用して「ページリダイレクト」動作でRabbit Holeを設定し、訪問者を製品のカテゴリページにリダイレクトします。
プレミアムコンテンツへのアクセスを制限する
特別なアクセスが必要なコンテンツタイプに「アクセス拒否」動作を使用します。バイパス権限と組み合わせることで、プレミアム購読者は通常通りページを表示でき、匿名ユーザーにはアクセス拒否メッセージが表示されます。
パラグラフライブラリアイテムへの直接アクセスを防ぐ
パラグラフライブラリアイテムは通常、親エンティティのコンテキスト内でのみ表示されるべきです。「ページが見つかりません」でRabbit Holeを設定し、これらのアイテムへの直接URLアクセスを防ぎます。
移行コンテンツのSEOリダイレクト
古いサイト構造からコンテンツを移行する際、「ページリダイレクト」動作を301(恒久的に移動)で使用して、古いURLパターンを新しい場所にリダイレクトし、SEO価値を保持します。
ユーザープロフィールを外部ディレクトリにリダイレクトする
外部のスタッフディレクトリを使用している組織では、ユーザーエンティティでRabbit Holeを設定し、プロフィールページを外部ディレクトリURLにリダイレクトします。ユーザー固有のURLを構築するためにTokenを使用することも可能です。
セキュリティ監視用のハニーポットページを作成する
「アクセス拒否」レスポンスをトリガーするコンテンツタイプを作成します。これらのページへのアクセス試行をログに記録し、潜在的な悪意のある活動として監視できます。
Tips
- エンティティフィールドに基づく動的なToken置換を使用したリダイレクトパスオプションを拡張するには、Tokenモジュールを有効にしてください
- 恒久的なURL変更には301(恒久的に移動)リダイレクトを、一時的なリダイレクトには302(発見)を使用して、適切なSEO処理を確保します
- バイパス権限により、コンテンツ編集者は制限されるはずのページをプレビューできます - 信頼できるロールにこの権限を付与してください
- 既存の値を持つバンドルでエンティティオーバーライドを無効にすると、すべてのエンティティごとの設定が削除されます - 確認プロンプトにより誤ったデータ損失を防ぎます
- Tokenを使用する場合はリダイレクトパスを十分にテストしてください - 無効なパスはフォールバック動作をトリガーします
- 多言語サイトでは、Rabbit Hole設定は翻訳可能で、言語ごとに異なる動作を設定できます
- カスタム動作プラグインは、RabbitHoleBehaviorPluginBaseを拡張し、@RabbitHoleBehaviorPluginアノテーションを使用して作成できます
- 非推奨のサブモジュール(rh_node、rh_userなど)はバージョン3.0で削除されます - 統一設定システムに移行してください
Technical Details
Admin Pages 2
/admin/config/content/rabbit-hole
異なるエンティティタイプでRabbit Hole機能を有効にするためのメイン設定ページ。サポートされているすべてのコンテンツエンティティタイプのテーブルを表示し、各タイプの有効/無効を切り替えるチェックボックスを提供します。有効化されたエンティティタイプについては、デフォルト動作とエンティティごとのオーバーライドが許可されているかどうかを含む現在のバンドル設定を表示します。
/admin/config/content/rabbit-hole/{entity_type_id}
エンティティタイプの特定のバンドルにRabbit Hole動作を設定するための設定ページ。デフォルト動作の設定、エンティティごとのオーバーライドの有効化、各バンドルのバイパスオプションの設定が可能です。
権限 3
Hooks 3
hook_rabbit_hole_values_alter
動作プラグインがロードされて実行される前にRabbit Holeの値を変更することをモジュールに許可します。動作の実行に影響するアクション、バイパスアクセス、その他の値を変更できます。
hook_rabbit_hole_response_alter
動作プラグインのperformAction()メソッドが実行された後にレスポンスを変更することをモジュールに許可します。リダイレクト先を変更したり、レスポンスを完全に置き換えることができます。
hook_rabbit_hole_rabbit_hole_behavior_plugin_info_alter
プラグインマネージャーによって検出された動作プラグイン定義を変更することをモジュールに許可します。
Troubleshooting 7
Rabbit Holeは正規リンクテンプレートが定義されているコンテンツエンティティタイプのみをサポートします。エンティティタイプの定義に'canonical'リンクテンプレートが含まれていることを確認してください。
ユーザーがそのエンティティタイプの「Rabbit Holeアクションをバイパス」権限を持っていないことを確認してください。バンドル設定で「権限ベースのバイパスを無効にする」が有効になっているか確認してください。
Tokenモジュールがインストールされ有効になっていることを確認してください。エンティティタイプに対するToken構文が正しいことを確認してください(例:ノードには[node:field_name]、ユーザーには[user:field_name])。
これは期待される動作です。Rabbit Holeは、非表示動作が設定されている場合、エラーページに着地するのを防ぐためにエンティティ編集フォームへ自動的にリダイレクトします。
エンティティにデータベースに保存されたエンティティごとのオーバーライド値がある場合、エンティティタイプを無効にする前に、まずすべてのバンドルでオーバーライドを無効にする(これにより値が削除される)必要があります。
バンドルで「個別エンティティでこれらの設定をオーバーライドすることを許可」が有効になっていること、および現在のユーザーが「[エンティティタイプ]のRabbit Hole設定を管理」権限を持っていることを確認してください。
フォールバックアクションは、Token置換後にリダイレクトパスが無効または空の場合にのみトリガーされます。Tokenフィールドに空の値を持つエンティティでテストしてください。
Security Notes 6
- Rabbit HoleはDrupalのセキュリティアドバイザリーポリシーの対象です
- リダイレクト機能はオープンリダイレクトの脆弱性を防ぐためにURLを検証します - 外部URLはTrustedRedirectResponseを介して処理されます
- 設定オプションを表示する前に権限チェックが実行されます - 「rabbit hole administer」権限のないユーザーは設定を表示または変更できません
- 「no_bypass」オプションは管理者に対しても動作を厳密に適用できます - コンテンツへのアクセスをロックアウトする可能性があるため、慎重に使用してください
- エンティティごとのオーバーライド値は、適切なアクセス制御を持つ標準のDrupalフィールドに保存されます
- リダイレクトパスでのToken置換はDrupalのトークンシステムを通じてサニタイズされます