Drupal 8のクリーンURLの問題を解決する
基本
Drupal 8では、クリーンURLはデフォルトで有効になっており、無効にすることはできません。ただし、ウェブサーバーにリライトモジュールをインストールする必要があります。
ブラウザのアドレスバーを確認してください。サイトのURLに?q=が含まれていてはいけません。
正しい「クリーンURL」の例
http://www.example.com/node/83
動作しない「クリーンURL」の例
http://www.example.com/?q=node/83
apache、wamp、xampp、IISなどのさまざまなシステム向けにクリーンURLを設定するための追加の手順があります。
クリーンURLのためのサーバー設定
他のウェブサーバー要件の詳細をご覧いただけます。
httpd.confを使用した専用サーバーでのクリーンURLのサーバー設定
専用サーバーでクリーンURLを有効にするには、次の手順が含まれます:
1. Apacheのmod_rewriteを有効にします。ウェブホストに問い合わせるか、Apacheのmod_rewriteドキュメントを参照して、その方法の詳細を確認できます。最低限、Apacheインストールでmod_rewriteが有効になっていることを確認する必要があります。
Apache2でmod_rewriteが利用可能かどうかを確認するには、コマンドラインで次のように入力して、インストールされているすべてのApacheモジュールを一覧表示できます:
apache2ctl -M
一部のシステムでは、このコマンドは次のようになる場合があります:
apachectl -M
または
httpd -M
2. 出力で、rewrite_moduleがモジュールリストに含まれているかどうかを確認します。
リライトモジュールがリストにない場合は、コンパイルするか、ロード可能なモジュールとして利用可能にする必要があります。一般的に、次の行を含めることでApacheにモジュールをロードさせることができます:
LoadModule rewrite_module modules/mod_rewrite.so
AddModule mod_rewrite.c
Apache設定ファイル(設定ファイルの情報は下記参照)。設定ファイルにAddModule mod_rewrite.cがあるがコメントアウトされている場合は、コメントを解除してください。ファイルを編集せずにモジュールを有効にするには、次の方法が機能する場合があります:
a2enmod rewrite
これらの方法は、オペレーティングシステムとApacheサーバーのすべての組み合わせで機能するとは限らないことに注意してください。正しい構文については、Apacheソフトウェアに付属のApacheドキュメントを参照してください。
新しい設定を有効にするには、Apacheを再起動することを忘れないでください。
3. 次のステップは、サイトに適したApache設定ファイルを見つけることです。サーバーの設定によっては、適切なApache設定ファイルはhttpd.conf、バーチャルホスト固有のファイル(vhost.conf)、定義されたサイトファイル(「default」など)、またはapache2.confの場合があります。通常、これらは/etc/httpd/conf、/etc/apache2、またはそのサブディレクトリにあります。ない場合は、次のコマンドを試してください:
find /etc -name httpd* or find /etc -name apache2*
ファイルがファイルシステムの別の場所にある場合は、それを見つけるためのコマンドです。
これらのファイルへの書き込み権限がなく、クリーンURLがすぐに機能しない場合は、システム管理者またはホスティングプロバイダーに問い合わせる必要があるかもしれません。ただし、トラブルシューティングのためにこれらの設定ファイルを読むことはできます。
4. 次のステップは、Drupal設定を設定ファイルに直接コピーまたは含めることです。設定ファイルにDrupalディレクティブを含める方法については、ここに手順があります。Drupal 8の以下のようなルールの例については、Drupalの.htaccessファイルを参照してください:
RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !=/favicon.ico
RewriteRule ^ index.php [L]
または、ワイルドカードを使用してインストールされているすべてのサイトに一致させるDebian 8 + Apache2 + ISPConfigの例:
<Directory /var/www/clients/*/*/web/>
RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]
</Directory>
使用しているDrupalメジャーバージョン(つまり8.x)の.htaccessファイルを確認してください。
注記:リライトルールをApache設定ファイルに配置したくない場合は、Drupalの.htaccessファイルをそのまま使用できます(仮想ホスティングで作業しているかのように)。Apache設定ファイルにAllowOverrideディレクティブを設定する必要があります(これにより、サイトでのローカルな.htaccessの上書きが許可されます):
AllowOverride All
AccessFileName .htaccess
.htaccessの詳細については、Apache .htaccessを使った舞台裏をお読みください。Apache 2のAllowOverrideディレクティブの例を確認することも役立つかもしれません。
MultiViewsに関する注記:Apacheには「MultiViews」(より一般的には「コンテンツネゴシエーション」)と呼ばれる機能があり、ファイル拡張子なしでページにアクセスできるようになります。例えば、「valuation.txt」という名前のファイルがある場合、MultiViewsをサポートするサイトは「example.com/evaluation」というURLでこのファイルにアクセスできます。MultiViewsは意識して使用すれば便利な機能ですが、DrupalのクリーンURLが有効になっていると問題を引き起こす可能性があります。何をしているか理解していない場合は、DrupalのクリーンURL機能を使用する予定であればMultiViewsを使用しないでください。ただし、MultiViewsはデフォルトのApacheインストールでは有効になっていないため、この注記はおそらく適用されません。MultiViewsの詳細についてはApacheドキュメントを参照してください。
.htaccessを使用した共有サーバーでのクリーンURLのサーバー設定
標準的なDrupalインストールには、クリーンURLを機能させるのに十分な.htaccessファイルのサンプルが含まれています。先頭の「ドット」のため、このファイルのコピーを省略しがちです。したがって、クリーンURLを有効にする前に、このファイルがDrupalインストールに存在することを確認してください。
ターミナルでこれを確認するには、ls -aを使用して「ドット」ファイルも一覧表示されることを確認してください。
このファイルがインストールされているのにクリーンURLが機能しない場合は、以下のトラブルシューティングのヒントのいくつかを試すことができます。それでもクリーンURLを機能させることができない場合は、ホスティングプロバイダーに問い合わせてください。
トラブルシューティング
.htaccessが使用されているかどうかを確認する
Apacheは、サイトの.htaccessファイルの指示に従うように明示的に設定する必要があります。これはデフォルトでは無効ですが、ほとんどのホストは有効にします。上記のAllowOverride Allディレクティブがこれを行います。- これにより.htaccessが機能し始めます。
ホストが.htaccessファイルを読み取るかどうかを確認するには、(一時的に)ファイルに何か無効な行を追加して壊してみます。この誤った設定により、このディレクトリからページを読み込もうとすると、サイトはすぐに「500サーバーエラー」を返し始めるはずです。(無効な行はすぐに削除してください。)
これを行ってもサイトが壊れない場合は、.htaccessは無視されています。ホストのサポートを受けるか、上記のようにhttpd.confで有効にするまで、クリーンURLを使用できません。一部のホストは、サイトのコントロールパネルからこのオプションを有効にできるため、最初に確認してください。
RewriteBaseの設定
サイトで変更が必要になる可能性のある主な設定パラメータはRewriteBaseです。これは、Drupalのリライトディレクティブを配置する場所に応じて、Drupalの.htaccessファイルまたはhttpd.confファイルで指定できます(上記参照)。デフォルトでは、RewriteBaseパラメータはDrupalの.htaccessファイルでコメントアウトされており、これは多くの設定でうまく機能します。
クリーンURLの取得に問題がある場合は、このパラメータを変更する必要があるかもしれません。例えば、ApacheのDocumentRootが/var/www/の場合(つまり、ブラウザをhttp://www.example.com/に向けると/var/www/index.htmlが表示される)、Drupalインストールが/var/www/mysite/サブディレクトリにある場合、RewriteBaseは次のように設定できます:
RewriteBase/mysite
これで解決する場合があります。一部の設定では、次の設定で
RewriteBase /
クリーンURLが機能するようになります。
$base_url
まだ設定されていない場合は、settings.phpファイルで$ base_url変数を手動で設定する必要があるかもしれません。現在、FastCGIで実行されているサーバーでは、$ base_url変数をコメントアウトしたままにすると問題が発生する可能性があることが知られています(http://bugs.php.net/bug.php?id=19656参照)。
マルチサイト
RewriteBaseは、Drupalインストールが1つのサイトのみを提供する場合、または提供するすべてのサイトがドメインの同じサブディレクトリにある場合に機能します。例えば、
RewriteBase /
は次のサイトで機能します:
http://www.example.com/
http://www.example2.com/
http://www.example3.com/
RewriteBase /mysite
は次のサイトで機能します:
http://www.example.com/mysite
http://www.example2.com/mysite
http://www.example3.com/mysite
ただし、サイトが異なるサブディレクトリにある場合、RewriteBaseは機能しません。各サブディレクトリに特別なルールを作成する必要があります。例えば、Drupalインストールが次のサイトを提供している場合:
http://www.example.com/
http://www.example.com/mysite
両方のサイトでクリーンURLを有効にするには、次を追加する必要があります:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} ^/mysite/
RewriteRule ^ /mysite/index.php [L]
既存のリライトルールの前に追加します。
index.phpファイルの場所
一部のサーバー設定では、Drupalの.htaccessファイルに別の変更が必要な場合があります。Drupalの.htaccessファイルの末尾で、次のような行を探してください:
<code>RewriteRule ^ index.php [L] </code>
index.phpを、Drupalインストールのindex.phpファイルへのURLパス(ベースURLの後の部分のみ)に置き換える必要がある場合があります。例えば、サイトのホームページURLがhttp://example.com/subdir/の場合、index.phpの代わりに/subdir/index.phpを使用する必要があるかもしれません。サイトのホームページURLがhttp://example.com/の場合、index.phpの代わりに/index.phpを使用する必要があるかもしれません。これは一部のサーバー設定では必要ですが、すべてではありません。
Pathモジュールを使用してクリーンURLを作成する
クリーンURLを使用すると、Drupalは「http://www.example.com/node/83」という形式のURLを生成します。URLの「node/##」部分を「news/june-1st-news」のようなものに変更するには、サイトでPathモジュールを有効にする必要があります。Pathモジュールの使用の詳細については、Pathモジュールのマニュアルページを参照してください。