【CakePHP3】階層を持った静的ファイルにアクセスするとURLにwebrootが付与されてしまう現象の対処方法

CakePHP3で静的コンテンツを置く場所は、通常であればweboot配下になるのですが、静的コンテンツにアクセスしようとした時にURL「weboot」が強制的に付与されることがあります。

例えば、「/webroot/dir/index.html」にファイルを設置してURLでアクセスすると

http://example.com/dir/index.html

http://example.com/dir/

どちらでも同じ静的ファイルを表示できます。

しかし、最後のスラッシュが無い場合「http://example.com/dir」は、「http://example.com/webroot/dir/」とwebrootが付与された形でリダイレクトされてします。

別に気にならなければそのままでも良いのですが、WordPressを設置したりしているとURLが変わってしまうため「404エラー」が表示されてしまいますし、SEO的にも同じページのURLが複数あるとよろしくないため、統一したほうが良いです。

Apacheログで動作を確認する

原因を探すために、Apacheログをチェックします。

静的ファイルにアクセスしたログ

生定期ファイルにアクセスした際のログになります。

一度アクセスされた後、301リダイレクトで「/cakephp3/webroot/test/」を表示しています。

WordPressを設置した際の動作

WordPressを静的コンテンツに配置して動作させていると、WordPressの場合は404エラーページになってしまいます。

webrootが付与されてしまう原因の対処方法

静的ファイルの場合は問題なくコンテンツは表示されますがURLが変わってしまいます。WordPressのような別のソフトウェアがあるとエラーなる可能性があります。

というわけで、今回は「.htaccess」を修正してwebrootが付与された場合は、強制的にwebrootを除いた状態のURLにリダイレクトさせる方法で問題が解決できます。

「.htaccess」ファイルを修正

今回修正する「.htaccess」ファイルは、「webroot」ディレクトリ配下にある「.htaccess」ファイルになります。

デフォルトだと下記のようになっているかと思います。

これを下記のように修正します。

黄色い部分を使いしています。

CakePHP2の場合は、4行目のディレクトリチェック部分はデフォルトで記述されていたと思いますが、CakePHP3の場合は追記してあげる必要があります。

上記を修正することでアクセスログは下記のようになります。

リダイレクト回数が1回から2回に変わり、最終のURLが目的のURLになっていることがわかると思います。

スポンサーリンク

最後に

URLに「webroot」が付与されてしまう原因の対処方法を紹介しましたが、デメリットとしてリダイレクト回数が増えてしまいます。

これがベストの対応方法かというとそうではありませんが、そもそもリダイレクトをせずにURLを記述してあげる必要があります。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です