レンタルサーバーでDrupal8のURLをサブディレクトにリダイレクト
- レンタルサーバーでの複数のURLをそれぞれのディレクトリに振り分け設定が難しい場合があります。
- .htaccessでそれぞれのURLをルートディレクトからサブディレクトリにリダイレクトすることがよく使われます
- root directory(document_root): php ← url(http://2drill.local)がここに来る
- sub directory: 2drills-d8
- URL: http://2drill.local
- ここで、.htaccessより2drills-d8サブディレクトリにリダイレクトの記述は以下のよう
RewriteEngine on # automatically load sub-directory: 2drills-d8 <- 2drill.local #site #RewriteCond %{HTTP_HOST} ^2drill\.local$ [NC] RewriteCond %{HTTP_HOST} ^2drill\.local$ [NC] RewriteRule ^$ 2drills-d8/index.php [L] #files RewriteCond %{HTTP_HOST} ^2drill\.local$ [NC] RewriteCond %{DOCUMENT_ROOT}/2drills-d8%{REQUEST_URI} -f RewriteRule .* 2drills-d8/$0 [L] #url's RewriteCond %{HTTP_HOST} ^2drill\.local$ [NC] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ 2drills-d8/index.php?q=$1 [L,QSA]
- Drupal8のインストールは無事できました
サブディレクトリよりページがリダイレクト時ににエラーが発生
- Drupal8インストール直後に、サブディレクトリがURLに反映されています。例:ログインページ→http://2drill.local/2drills-d8/user/login
- サブディレクトリをURLから削除して、ログインページにもアクセスができます
- 各リンクのサブディレクト名を消すために、DB上ですべてのキャッシュを消す必要があります
TRUNCATE `cache_bootstrap`; TRUNCATE `cache_config`; TRUNCATE `cache_container`; TRUNCATE `cache_data`; TRUNCATE `cache_default`; TRUNCATE `cache_discovery`; TRUNCATE `cache_dynamic_page_cache`; TRUNCATE `cache_entity`; TRUNCATE `cache_menu`; TRUNCATE `cache_page`; TRUNCATE `cache_render`;
- 各リンクのサブディレクト名を消すために、DB上ですべてのキャッシュを消す必要があります
- サブディレクトなしで、ログインページ(http://2drill.local/user/login)でログインをすると、以下のエラーが発生
- Redirects to external URLs are not allowed by default, use \Drupal\Core\Routing\TrustedRedirectResponse for it.
- このメッセージを調べてみたら、coreのRedirectResponseSubscripber.phpから出たものです
- 原因: $safe_response = LocalRedirectResponse::createFromRedirectResponse($response); に、LocalRedirectResponseに、サブディレクトが含まれると、エラーが発生します
- ここの記述から見ると、LocalRedirectResponseを使用せず、TrustedRedirectResponseを使用すれば、エラーが発生しないです
サイトの設定ファイル(settings.php)でサブディレクトを消去
- coreのRedirectResponseSubscripber.phpを修正することができます
- LocalRedirectResponseを使用せず、TrustedRedirectResponseを使用するように修正
- この修正が次のDrupal8更新時に消されるでしょう(Drupalのアップグレード)
- アップグレード都度にこの修正を行うのはナンセンスです
- Googleで同じ問題の対処法を調べてみたら、サイトの設定ファイル(settings.php)にサブディレクトを消去する方法があります
- $GLOBALS['request']のSCRIT_NAMEにあるサブディレクト名を消す記述を追加します
if ( isset($GLOBALS['request']) && preg_match('/\/2drills-d8/', $GLOBALS['request']->server->get('SCRIPT_NAME') ) ) { $GLOBALS['request']->server->set('SCRIPT_NAME', preg_replace('/\/2drills-d8/','',$GLOBALS['request']->server->get('SCRIPT_NAME')) ); }
- Drupalのアップグレード時に、サイトの設定ファイル(settings.php)が更新されないので、毎回修正する必要はありません
- $GLOBALS['request']のSCRIT_NAMEにあるサブディレクト名を消す記述を追加します