Read Only Mode
サイトをオフラインにすることなく、コンテンツの追加・編集を一時的にロックする読み取り専用モードを提供するモジュール。
readonlymode
インストール
composer require 'drupal/readonlymode:8.x-1.4'
composer require 'drupal/readonlymode:8.x-1.2'
概要
Read Only Modeは、Drupal標準のメンテナンスモードに代わる柔軟なソリューションを提供するモジュールです。メンテナンスモードがサイト全体を静的なメンテナンスページに置き換えるのに対し、Read Only Modeは既存のコンテンツの閲覧を許可しながら、新規コンテンツの追加や既存コンテンツの編集のみを制限します。
典型的なユースケースとして、本番サーバーでRead Only Modeを有効にし、データベースを開発サーバーにコピーして作業を行い、完了後にデータベースを本番サーバーに戻してRead Only Modeを無効にする、というワークフローがあります。これにより、ユーザーはメンテナンス中もサイトのコンテンツを閲覧し続けることができます。
モジュールはフォームのホワイトリスト機能も提供しており、外部サービスにデータを送信するフォームなど、Drupalデータベースを変更しないフォームは読み取り専用モード中も利用可能にすることができます。ワイルドカード(*)を使用したパターンマッチングにも対応しています。
Features
- サイトを読み取り専用状態にロックし、すべてのフォーム送信をブロックしながらコンテンツ閲覧は許可
- Drupal標準のメンテナンスモードとは独立して動作し、併用も可能
- ログイン、検索、パスワードリセットなど重要なフォームはデフォルトで許可
- ワイルドカード対応のフォームホワイトリスト機能(例:webform* で全Webformを許可)
- 送信可能フォームと表示のみフォームの2種類のホワイトリストを管理可能
- トークン対応のカスタム警告・エラーメッセージの設定
- フォーム編集ページへのアクセス時に指定URLへリダイレクトするオプション
- 管理者用のパーミッションで読み取り専用モード中もすべてのフォームにアクセス可能
- 読み取り専用モード状態を表示するブロックの提供
- Drupal 7からの設定マイグレーションをサポート
- Drushコマンドによる読み取り専用モードの有効化・無効化
Use Cases
データベースマイグレーション中のサイト保護
本番環境から開発環境へデータベースをコピーして作業を行い、その後本番に戻す際に使用します。本番サーバーでRead Only Modeを有効にすることで、マイグレーション中のデータ不整合を防止できます。ユーザーはサイトを閲覧し続けることができ、完全なダウンタイムを避けられます。
大規模デプロイメント時のコンテンツフリーズ
大規模な機能追加やモジュールアップデートをデプロイする際に、一時的にコンテンツ変更をフリーズします。デプロイ完了後にRead Only Modeを無効にすることで、コンテンツの競合なく安全にデプロイできます。
特定フォームのみを許可したメンテナンス
サイトメンテナンス中でも、お問い合わせフォーム(外部サービス経由で送信)やニュースレター登録フォームなど、Drupalデータベースに書き込まないフォームは許可したい場合に使用します。ホワイトリストにフォームIDを追加することで実現できます。例:contact_* でContactモジュールの全フォームを許可。
イベント期間中のコンテンツ保護
特定のイベントやキャンペーン期間中にコンテンツを固定したい場合に使用します。誤ってコンテンツが変更されることを防ぎつつ、サイトは通常通り閲覧可能な状態を維持できます。
管理者のみがコンテンツ編集可能な一時的制限
「Access all forms while in Read Only Mode」パーミッションを管理者ロールに付与し、Read Only Modeを有効にすることで、管理者以外のユーザーからのコンテンツ変更を一時的にブロックできます。サイトリニューアル前のコンテンツ整理などに有用です。
Tips
- DrushまたはシェルスクリプトでRead Only Modeの有効化・無効化を自動化すると、CI/CDパイプラインに組み込みやすくなります
- Read Only Modeブロックをサイトヘッダー領域に配置すると、すべてのページでメンテナンス状態を視覚的に伝えられます
- メッセージには[site:name]トークンを使用すると、サイト名が動的に挿入されます。他のトークン([current-user:name]など)も使用可能です
- メンテナンスモードとRead Only Modeは独立しており、同時に有効にする必要はありません。目的に応じて使い分けてください
- フォームIDを調べるには、フォームのHTML内のinput[name="form_id"]の値を確認するか、開発者ツールで確認できます
Technical Details
Admin Pages 1
/admin/config/development/maintenance
Drupal標準のメンテナンスモード設定ページにRead Only Modeの設定が統合されています。読み取り専用モードの有効化、メッセージのカスタマイズ、許可するフォームの設定を行えます。
権限 2
Hooks 2
hook_form_alter
すべてのフォームに対してバリデーションハンドラを追加し、読み取り専用モード中のフォーム送信をブロックします。許可されていないフォームはフォーム要素が削除され、警告メッセージに置き換えられるか、設定されたURLにリダイレクトされます。
hook_form_system_site_maintenance_mode_alter
Drupal標準のメンテナンスモード設定フォームにRead Only Modeの設定フィールドを追加します。
Drush Commands 3
drush config:get readonlymode.settings
読み取り専用モードの現在の設定を確認します。enabledの値が1なら有効、0なら無効です。
drush config:set readonlymode.settings enabled 1
読み取り専用モードを有効にします。
drush config:set readonlymode.settings enabled 0
読み取り専用モードを無効にします。
Troubleshooting 4
そのフォームがデフォルトの許可リスト(user_login_form, search_form, views_exposed_formなど)に含まれていないか確認してください。含まれている場合は正常な動作です。フォームをブロックしたい場合は、config/install/readonlymode.settings.ymlのforms.default.editから該当フォームIDを削除する必要があります(設定のオーバーライドが必要)。
「View all Read Only Mode notices and warnings」パーミッションがそのユーザーのロールに付与されているか確認してください。このパーミッションがない場合、フォームはブロックされますがメッセージは表示されません。
リダイレクトURLは内部パスである必要があります。外部URLや無効なパスはバリデーションエラーになります。先頭のスラッシュは省略しても自動で追加されます。例:node/123 または about-us
「Forms that can be submitted」フィールドにワイルドカードパターンを使用します。例えば webform* と入力すると、webform_submission_* や webform_* など、webformで始まるすべてのフォームIDにマッチします。
Security Notes 2
- 「Access all forms while in Read Only Mode」パーミッションは信頼できる管理者ロールにのみ付与してください。このパーミッションを持つユーザーはRead Only Mode中も全フォームを送信できます
- Read Only Modeはセキュリティ機能ではなく、あくまでメンテナンス補助ツールです。悪意のあるユーザーからの保護には適していません