php7.3-apacheという公式イメージを利用して、
dockerでlaravelを動かしたら「/」直下は表示されるのにそれ以外のルーティングができなかった。
具体的には 404 not found がなどが出ていた。
その時の原因と対処手順を備忘がてらまとめたので参考に。
docker-laravelでルーティングできない原因
まずは結論から。
docker-laravelで、「/」直下以外のルーティングができない原因は以下の二つ。
- mod_rewriteが動いてない
- AllowOverride Allの設定をしていない
つまり、
docker-laravelで、「/」直下以外のルーティングができない原因は、
どちらもapacheが関係していると言うことだ。。
原因① mod_rewriteが動いてない
mod_rewiteとはApacheで利用されいてるモジュールで、
URLの書き換え・リダイレクト処理を行なってくれるモジュールだ。
主に「.htaccess」というファイルに任意の処理を記述して使用する。
このmod_rewriteと言うモジュールが動いていないのが原因その①だった
https://httpd.apache.org/docs/current/ja/howto/htaccess.html
対策①:mod_rewriteを有効化する
対策としてはシンプルで、
mod_rewriteが動いていないので、mod_rewriteが動くようにしてやれば良い。
具体的には、php7.3-apacheという公式イメージには、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
これでルーティングできるようになるかもしれない。
が、筆者は原因②のせいでまだ動かなかった。
https://httpd.apache.org/docs/2.4/mod/mod_rewrite.html
原因② AllowOverride Allの設定をしていない
AllowOverride は 、
.htaccess による設定の上書きを許可するかを指定するもの。
上位ディレクトリの AllowOverride 設定は、下位ディレクトリに継承される。
Allを指定すると.htaccess で設定可能なものは全て有効になる。
docker-laravelでルーティングを有効化するには、この設定をしてやる必要があった。
対策②: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>
/etc/apache2/sites-available/000-default.confを修正し、
イメージをビルドしていく。
まずは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
これでルーティング可能になった。
docker-laravelでルーティングできない原因と対策まとめ
mod_rewriteが動いてない
→ モジュール「mod_rewrite」有効化しよう(シンボリック貼って有効化できる)
AllowOverride Allの設定をしていない
→/etc/apache2/sites-available/000-default.conf に、AllowOverride Allの設定を記述しよう。
https://readouble.com/laravel/8.x/ja/routing.html
Laravel 関連記事
[…] (Docker-Laravel-apache) ルーティングができない原因と対処法 […]