DockerのLAMP環境下でルーティングが404になったときの対応

DockerのLAMP環境下でルーティングが404になったときの対応

はじめに

久しぶりに Docker 上に作成した Laravel のプロジェクトでいろいろ検証しようと設定していたのですが、認証機能を追加してloginもしくはregisterのリンクをクリックしたときに 404 ステータスが返ってきました。

確か過去に似たようなことがあったな…と思いつつ記録に残していなかったので、今回はその原因と対応をまとめます。

※Laravel9 系で作業しています。

結論

結論として Docker で構築している Web サーバのコンテナ(Apache)で、mod_rewriteが有効になっていなかったことが原因です。

mod_rewriteは Apache のモジュールで URL を書き換えやリダイレクトを指定する事ができます。

mod_rewrite を有効化する

Docker でmod_rewriteを有効化するには Web サーバの Docker ファイルに以下の行を追加します。

"docker/web/Dockerfile"
# パッケージの更新及び必要ソフトのインストール
RUN apt-get update \
  && apt-get install -yqq \
  zlib1g-dev \
  libpq-dev \
  mariadb-client \
  unzip \
  libzip-dev \
  zip \
  && docker-php-ext-install \
  pdo_mysql \
  mysqli \
  # ↓今回追加した箇所
  && a2enmod rewrite \
  # ↑今回追加した箇所
  && docker-php-ext-enable mysqli \
  # xdebug install
  && pecl install xdebug \
  && docker-php-ext-enable xdebug

a2enmod [有効化したいモジュール]はモジュールを有効化するコマンドで、後述するモジュールを有効化します。

因みに無効化する場合はa2dismod rewriteと実行します。

mod_rewrite の使用方法

mod_rewriteの使用方法は

  1. .htaccess に記述する
  2. http.conf(Apache)の設定ファイルに記述する

の 2 種類の方法があります。

Laravel ではpublicディレクトリ配下に.htaccessが配置されていて、その中でmod_rewriteを有効化している記述があります。

"your-project/pugblic/.htaccess"
<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews -Indexes
    </IfModule>

    RewriteEngine On # ←ここで有効化している

    # Handle Authorization Header
    RewriteCond %{HTTP:Authorization} .
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

    # Redirect Trailing Slashes If Not A Folder...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_URI} (.+)/$
    RewriteRule ^ %1 [L,R=301]

    # Send Requests To Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
</IfModule>

過去に書いた記事と公開しているリポジトリでも設定を修正しました。

余談

a2enmodコマンドですがperlで書かれたスクリプトのようでした。中身を覗いてみると色々な発見があって面白いですね。

$ head -20 /usr/sbin/a2enmod
#!/usr/bin/perl -w
#
# a2enmod by Stefan Fritsch <sf@debian.org>
# Licensed under Apache License 2.0
#
# The coding style is "perltidy -pbp"

参考