Dockerで作ったLAMP環境でWordPressのトップページ以外が表示できないときの対処法

DockerでApacheを使ったLAMP環境を用意して、そこにWordPressのサイトを構築したあとトップページ以外のページが表示できないときの対処法です

DockerによるPHPとApache

DockerでLAMP環境を作るときにPHPとApacheを使うときは、それぞれのイメージを別々にインストールするか、php-apacheイメージを使って1つのイメージで構築するかになるかと思います。

この記事で書かれている内容はそのどちらでも適用できます。

.htaccessが使えるか確認

ここではトップページ以外が表示できないときの原因がサイトアクセスのコントロールである場合を想定しています。

WordPressは自身のサイトのアクセスを.htaccessを使ってコントロールしています。

自身のサイトのルートはどこからはじまって何をリダイレクトしたりエラーにしたり、ページはデフォルトでどのファイルにアクセスするかなどの設定を行います。

これがうまく動作していないときにトップページ以外が表示できなくなったりします。

この.htaccessファイルはmod_rewriteモジュールが扱っているので、Apacheの動作時にこのモジュールが使えるようになっている必要があります。

それを確認するには、Apacheイメージが実行されている環境で確認します。

まず以下のコマンドでApacheイメージに入ります。

$ docker exec -it Apacheコンテナ名 bash

うまく入ることができたら以下のコマンドを実行して現在の動作モジュールを確認します。

# apachectl -M
Loaded Modules:
 core_module (static)
 so_module (static)
 watchdog_module (static)
 http_module (static)
 log_config_module (static)
 logio_module (static)
 version_module (static)
 unixd_module (static)
 access_compat_module (shared)
 alias_module (shared)
 auth_basic_module (shared)
 authn_core_module (shared)
 authn_file_module (shared)
 authz_core_module (shared)
 authz_host_module (shared)
 authz_user_module (shared)
 autoindex_module (shared)
 deflate_module (shared)
 dir_module (shared)
 env_module (shared)
 filter_module (shared)
 mime_module (shared)
 mpm_prefork_module (shared)
 negotiation_module (shared)
 php7_module (shared)
 reqtimeout_module (shared)
 setenvif_module (shared)
 status_module (shared)

こんな感じで表示されると思いますが、上記の例ではこの一覧にrewrite_moduleが表示されていません。

この場合はmod_rewriteモジュールが使えるようになっていません。

これを使えるようにするには「RUN a2enmod rewrite」の記述をApacheのDockerfileに追記します。

ここではphp-apacheイメージをビルドする例として記述しています。

FROM php:7.3-apache
・・・〜
RUN a2enmod rewrite
・・・〜

そして、一度終了してから再ビルドを行います。

$ docker-compose down
$ docker-compose build --no-cache

キャッシュも使わずビルドします。

ビルドが終わったらmod_rewiteモジュールが使えるかどうか確認します。

再びApacheイメージに入ってチェックします。

$ docker exec -it Apacheコンテナ名 bash
# apachectl -M
・・・〜
rewrite_module
・・・〜

rewrite_moduleが表示されていれば使えるようになっています。

そして、忘れずに.htaccessを動作できる内容か確認しておきましょう。

以下はWordPressが作る基本的な設定内容です。

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

最後に動作確認してみましょう。

トップページ以外も表示できていれば終了です。