(Docker-Laravel-apache) 「/」以外のルーティングができない時の対処法

docker-laravel-fail-routing-without-index

 

php7.3-apacheという公式イメージを利用して、dockerでlaravelを動かしたら
「/」直下は表示されるのにそれ以外のルーティングができなかった。

具体的には404 not found がなどが出ていた。
原因と対処手順を備忘がてらまとめたので参考に。

 

docker-laravelで「/」直下以外ルーティングできない原因

まずは結論から。
原因は以下の二つ。

 

「/」直下以外ルーティングできない原因
  1. mod_rewriteが動いてない
  2. 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

これでルーティング可能になった。

 

記事が気に入った方はシェアをお願いします!

コメントを残す

メールアドレスが公開されることはありません。