[CakePHP3]webroot配下のディレクトリやファイルを表示する方法

[CakePHP3]webroot配下のディレクトリやファイルを表示する方法
2021年08月18日2023年10月10日

CakePHP3で画像やcssなど静的ファイルを読み込ますためにはwebroot配下に置きますが、階層を持ったディレクトリ構成を配置したい時があると思います。

ファイルはデフォルトのままでも表示してくれますが、index.htmlやindex.phpのファイルにアクセスしたい場合、ディレクトリだけ指定してアクセスしたいですよね。

ですがデフォルトのままだとCakePHPのエラー画面が表示されてしまいます。

そこで、「/manual/index.html」を「/manual/」のURLだけでアクセスさせる方法を紹介します。

今回やりたかったこと

今回やりたかったことを説明したほうがわかりやすいと思いますので、ちょっと紹介します。

webroot配下に「manual/index.html」を配置しています。

ただ上記だと「http://sample.com/manual/index.html」は問題なく表示されるのですが「http://sample.com/manual/」にすると「Error: ManualController could not be found.」エラーが表示されます。

2340823407234123

URL結果
http://sample.com/manual/index.html表示される
http://sample.com/manual/エラーになる

この両方のURLでもちゃんと静的ページを表示する方法になります。

ファイル修正

今回の対応で修正するファイルが1つあります。webroot配下にある「.htaccess」ファイルに一行追加します。

変更前の「.htaccess」ファイル

.htaccessファイルの書き方をわかる人であれば既にお気づきかと思いますが、デフォルトのママだとファイルが存在するかしかチェックしていません。

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f ←ファイルが存在するかどうか判断
    RewriteRule ^ index.php [L]
</IfModule>

つまりファイルが存在するかはチェックしているのですが、ディレクトリが存在するかはチェックしていないのです。

変更後の「.htaccess」ファイル

下記のようにディレクトリの存在チェックをするように変更してあげます。

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
</IfModule>

これだけで先ほどの問題は解決できます。

「.htaccess」ファイルを修正後の注意点

ディレクトリの存在チェックを追加することで1点注意すべき点があります。

それは、ディレクトリと同じ「コントローラー名 & indexアクション」は避けるということです。

例えばよくあるのが管理画面を設けるためにwebroot配下に「admin」ディレクトリを作成して、管理画面で使用するファイルをその中に入れた場合に不具合が起こります。

CakePHPで管理画面をつくると基本「Admin」でControllerをつくると思います。

そうすると、「コントローラー名:AdminController、アクション名:index」にしてしまうと、webroot配下にController名と同じディレクトリがあるため、ディレクトリを先に読みにいってしまいます。

なので、webroot配下に設置するディレクトリ名と同じ名前のControllerがある場合は、どちらかを違う名前にしておく必要があります。

まとめ

CakePHP2の場合は、ディレクトリチェックまで記述されていましたが、Cakephp3から無くなっているようです。

今まで出来ていたのにCakePHP3からできなくなった?と思われた方もいるんではないでしょうか。

「.htaccess」ファイルを修正することで今回の問題は解消できますが、ディレクトリ構成によっては不具合が発生する可能性もあるので、注意しましょう。

コメント

コメントを残す

お名前(任意)
コメント:新規