CIVICTHEME JOURNAL 35

Thanks for technical advice.

約2,500文字 読了目安:約6分

この記事の目次

リダイレクトの再考

#33 Drupal ドキュメントルートの設定にて設定完了後に出ているエラー


Redirects to external URLs are not allowed by default, use \Drupal\Core\Routing\TrustedRedirectResponse for it.

外部 URL へのリダイレクトを意図的に制限することで、オープンリダイレクト攻撃を防ぐ Drupal のセキュリティ機能です。

プライマリー > hooked-on01.com/public_html/drupal.hooked-on01.com/

インストール先 > hooked-on01.com/public_html/drupal.hooked-on01.com/recommended-project/

プライマリーをDrupalプロジェクト外部として扱っておりインストール先ディレクトリ外へのリダイレクトに対してDrupalがセキュリティ制限をかけてしまっています。

drupal.hooked-on01.com/recommended-project/admin/ が drupal.hooked-on01.com/admin/
にリダイレクトされてしまう為に出ているエラーとなります。

外部へのアクセスを許可する設定をする事で回避出来そうなので、TrustedRedirectResponseなどいくつかの設定を試みましたが、現状エラーを回避できていません。

共用サーバーであるXserverビジネススタンダードの機能面での制約の中で無理やりDrupalのインストールを行なった上での運営となっていることが理由となっています。

サブドメイン直下のディレクトリにDrupalプロジェクトディレクトリを設置

  1. Apacheの設定は不可
  2. ドキュメントルートの設定は不可
  3. .htaccessの設定でURL表示を設定

Drupalの管理画面のURLがリダイレクト設定によりDrupalプロジェクト外部にリダイレクトされていることでセキュリティエラーを出してしまっています。


上記のエラーについて、当サイトをご覧いただいた方から貴重なアドバイスをいただきました。

エラーはログインのリダイレクトや記事保存のリダイレクトなど管理画面でのアクションでページのリダイレクトがかかると出ます。このエラーが私の環境によるものと考えていましたが、アドバイスいただいた方から他にも事例があり、Drupal公式サイトに対策方法が掲載されている事を教えていただきました。

Drupal公式サイトのトピック

https://www.drupal.org/forum/support/installing-drupal/2023-01-06/drupal-10-redirects-to-external-urls-are-not-allowed-by-default

元の記事

https://www.drupal.org/project/drupal/issues/2612160#comment-11767977

8年前にDrupalコミュニティに参加しているドイツのエンジニアAndrej Galuf氏が書いたスニペットになります。

こちらに記載されているスニペットをsetting.phpに追加したところ、管理画面のアクションでリダイレクトした際に出ていたエラーが解決しました。スニペットは応急処置的なものですが、私の環境のように共有サーバーを使用している関係でApacheの DocumentRoot や RewriteBase 設定が出来ない場合重宝します。

setting.phpに追加するスニペット

  • スニペットに追加するコードの説明

    web/sites/default/settings.phpに以下の記述をすることでRedirects to external URLs are not allowed by default, use \Drupal\Core\Routing\TrustedRedirectResponse for it.のエラーを回避します。

    以下のスニペットを追加します。

    if (isset($GLOBALS['request']) and
    '/subdirectory/index.php' === $GLOBALS['request']->server->get('SCRIPT_NAME')) {
    $GLOBALS['request']->server->set('SCRIPT_NAME', '/index.php');
    }
    

    /subdirectory/index.phpがDrupalをインストールしたディレクトリになります。

    if (isset($GLOBALS['request']) and
    '/recommended-project/web/index.php' === $GLOBALS['request']->server->get('SCRIPT_NAME')) {
    $GLOBALS['request']->server->set('SCRIPT_NAME', '/index.php');
    }
    

    当サイトでは/recommended-project/web/index.phpとなります。

アドバイスへの謝辞

当サイトを含め私が運営するサイトは私自身の学習的な意味合いが強く、記事のテーマや記事の書き方も解りにくく、極めて個人的な事例がメインなので、記事を読んでいただき内容を理解していただいた事や記事内容について適切なアドバイスをいただけるのはありがたいことと感じています。

技術的な内容を適切かつ簡潔な形でアドバイスをいただけるような方なので、私より知識や技術的なリテラシーの高い方ですがそのような方が私の稚拙な記事を読んでいただいていると考えると記事を書くモチベーションになります。

Thanks for technical advice.

Drupal公式サイトの事例と具体的なスニペットの記載について簡潔でわかりやすいアドバイスをいただいています。

ご親切でわかりやすいアドバイスありがとうございました。

S.Takeda

すべての記事を見る ↗