はじめに
久しぶりに Docker 上に作成した Laravel のプロジェクトでいろいろ検証しようと設定していたのですが、認証機能を追加してlogin
もしくはregister
のリンクをクリックしたときに 404 ステータスが返ってきました。
確か過去に似たようなことがあったな…と思いつつ記録に残していなかったので、今回はその原因と対応をまとめます。
※Laravel9 系で作業しています。
結論
結論として Docker で構築している Web サーバのコンテナ(Apache)で、mod_rewrite
が有効になっていなかったことが原因です。
mod_rewrite
は Apache のモジュールで URL を書き換えやリダイレクトを指定する事ができます。
mod_rewrite を有効化する
Docker でmod_rewrite
を有効化するには Web サーバの Docker ファイルに以下の行を追加します。
# パッケージの更新及び必要ソフトのインストール
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
の使用方法は
- .htaccess に記述する
- http.conf(Apache)の設定ファイルに記述する
の 2 種類の方法があります。
Laravel ではpublic
ディレクトリ配下に.htaccess
が配置 されていて、その中でmod_rewrite
を有効化している記述があります。
<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"