ローカル環境の構築でDockerを使っているのですが、先日Docker上で.htaccessのリライトルールを設定しようとしたとき、リライトが走らない問題が発生しました。
サーバーにアップすると問題なく動いていたので、ローカルの設定に問題があることがわかりました。
問題を解明していくなかで、DockerのphpイメージではApacheのrewrite_moduleが無効、もしくはインストールされていないことが判明しました。その解決策をここに書いておきます。
目次
まずはApacheの有効なモジュールを見てみる
Apacheが入っているphpなどのコンテナで下記のコマンドを実行します。
$apachectl -M
コマンドを実行するとモジュールの一覧が表示されますがこの中に「rewrite_module」があるか確認しましょう。
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」は存在しません。
モジュールの後にある「static」と「shared」の意味は下記のとおりです。
static:固定で組み込まれている静的モジュール
shared:実行時に読み込まれる動的モジュール
rewrite_module をインストール
Apacheが入っているphpのコンテナで下記コマンドを実行します。
$a2enmod rewrite
もしくは、Dockerファイルに下記を追記して、ビルドすればrewrite_moduleがインストールされます。
FROM php:7.0-apache
RUN a2enmod rewrite
再度、「$apachectl -M」でモジュールの一覧を表示するとrewrite_moduleが追加されているはずです。