よく忘れるのでメモしておく。
- publicフォルダに.htaccessがあるか?
- Apacheなどのサーバー設定が間違っていないか?
- publicフォルダにindex.phpがあるか?
- web.phpのルート設定は間違ってないか?
- middlewareの処理に引っかかってないか?
この中で多い原因は.htaccessがないことと、サーバー設定が間違っていることだろう。
まずは、Apacheのerror.logを見てみることをお勧めする。
htaccessの設定
.htaccessを置いたからと言って正しくルーティングされるとは限らないので、中身を確認する。
特にエイリアスとかサブディレクトリとか設定してなければ初期設定でよい。
<IfModule mod_rewrite.c>
<IfModule mod_negotiation.c>
Options -MultiViews -Indexes
</IfModule>
RewriteEngine On
# Redirect Trailing Slashes If Not A Folder...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ /$1 [L,R=301]
# Handle Front Controller...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
</IfModule>
サーバーの設定
よくあるのはvirtual hostなどにしたときに書き方を間違っていることだ。
Apacheでいえば、httpd-vhost.confに設定を書くとして、
<VirtualHost *:80>
DocumentRoot "C:/www/project/public"
ServerName nsr-admin-web
<Directory "C:/www/project/public">
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
DirectoryIndex index.php index.html
</Directory>
ErrorLog "${SRVROOT}/logs/error.log"
CustomLog "${SRVROOT}/logs/access.log" combined
</VirtualHost>
以上のように書いたとする。
ポイントはプロジェクトフォルダのpublicをドキュメントルートとして、そこまでのアクセスを許可すること。
AllowOverride All , Require all gratedなども忘れずに書く。
そして、忘れがちなのが、publicフォルダ内に、index.php以外のphpやhtmlファイルがある場合、
htaccessでそれを自動的に読み取ってしまうため、
DirectoryIndex index.php index.html
この記述がないとindex.phpを読み取ってくれず、403 Forbiddenとなってしまうので注意。
ここで重要なポイントは:
Options Indexes FollowSymLinks
: ディレクトリインデックスを許可します(必要に応じてIndexes
を削除可能)AllowOverride All
: .htaccessファイルの使用を許可しますRequire all granted
: アクセスを許可しますDirectoryIndex index.php index.html
: index.phpをデフォルトのインデックスファイルとして指定します