Laravelでルートディレクトリにアクセス時にIndex Of表示、またはForbiddenになったときの対処法

よく忘れるのでメモしておく。

  • 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をデフォルトのインデックスファイルとして指定します