ID , 'noindex' , true)){ echo ''; } ?>

(Docker-Laravel-apache) ルーティングができない原因と対処法

docker-laravel-fail-routing-without-index

 

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

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

 

docker-laravelでルーティングできない原因

まずは結論から。
docker-laravelで、「/」直下以外のルーティングができない原因は以下の二つ。

 

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

 

docker-laravelで、ルーティングできない原因と対策まとめ

mod_rewriteが動いてない
→ モジュール「mod_rewrite」有効化しよう(シンボリック貼って有効化できる)

AllowOverride Allの設定をしていない
/etc/apache2/sites-available/000-default.conf に、AllowOverride Allの設定を記述しよう。

 

http://laravel.jp/

https://readouble.com/laravel/8.x/ja/routing.html

 

Laravel 関連記事

(Laravel) ルーティングを基礎から理解する

 

 

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

1件のコメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です