php7.3-apacheという公式イメージを利用して、dockerでlaravelを動かしたら
「/」直下は表示されるのにそれ以外のルーティングができなかった。
具体的には404 not found がなどが出ていた。
原因と対処手順を備忘がてらまとめたので参考に。
Contents
docker-laravelで「/」直下以外ルーティングできない原因
まずは結論から。
原因は以下の二つ。
- mod_rewriteが動いてない
- AllowOverride Allの設定をしていない
つまりどちらも原因はapache。
原因① mod_rewriteが動いてない
mod_rewiteとはApacheで利用されいてるモジュールで、
URLの書き換え・リダイレクト処理を行なってくれるものだ。
主に「.htaccess」というファイルに任意の処理を記述して使用する。
このモジュールが動いていないのが原因その①だった
mod_rewriteを有効化する
mod_rewriteが動いていないというのは、
mod_rewrite自体は存在しているが、有効化されていないということだ。
ということで以下のようにDockerfileに記述する。
FROM php:7.3-apache
RUN cd /etc/apache2/mods-enabled \
&& ln -s ../mods-available/rewrite.load
Debianのapacheでモジュールを有効化するには、
mods-enabledディレクトリから、mods-availableディレクトリに置いてある、
モジュールの設定ファイル(.load)へのシンボリックリンクを貼る必要がある。
上記はそのための記述だ(a2enmodという専用のコマンドでも可能)。
記述が済んだらDockerfileを使ってイメージをビルドしよう
docker build -t php:7.3-apache .
そしたら今作ったイメージを使って、コンテナを再起動
docker-compose up -d
これでルーティングできるようになるかもしれない。
が、筆者は原因②のせいでまだ動かなかった。
原因② AllowOverride Allの設定をしていない
AllowOverride は 、
「.htaccess」 で使用できるディレクティブを指定する為のディレクティブのこと。
Allを指定すると.htaccess で設定可能なものは全て有効になる。
この設定をしてやる必要があった。
000-default.confを修正する
AllowOverride Allの設定は、
/etc/apache2/sites-available/に置いてある、
000-default.confというファイルに記述していく必要がある。
000-default.confはvirtual hostの設定が書いてあるファイルだ。
デフォルトでは下記のようになっている(コメント部分は省略)
<VirtualHost *:80>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
こいつを修正し、イメージをビルドしていく。
まずは000-default.confをコンテナからローカルへコピーする
docker cp 17952b6a9f0e:/etc/apache2/sites-available/000-default.conf ./
下記のように000-default.confを修正する(コメント部分は省略)
<VirtualHost *:80>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
<Directory /var/www/html>
AllowOverride All
Options Indexes FollowSymLinks
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
見てお分かりの通り、<Directory /var/www/html> 〜 </Directory>の記述を追加した。
そしたらDockerfileを以下のように修正。
ビルド時にローカルの000-default.confをコンテナへコピーするための記述だ
(ローカルの000-default.confのパスに注意)。
FROM php:7.3-apache
COPY ./000-default.conf /etc/apache2/sites-available/000-default.conf
そしたらイメージをビルド(この時原因①mod_rewirte有効化の記述が残っているとビルドに失敗するので注意)。
docker build -t php:7.3-apache .
コンテナを再起動
docker-compose up -d
これでルーティング可能になった。