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

[CakePHP3]階層を持った静的ファイルにアクセスするとURLにwebrootが付与されてしまう現象の対処方法
2021年08月18日2023年10月10日

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ログをチェックします。

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

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

127.0.0.1 - - [07/Mar/2018:15:33:57 +0900] "GET /cakephp3/test HTTP/1.1" 301 372
127.0.0.1 - - [07/Mar/2018:15:33:57 +0900] "GET /cakephp3/webroot/test/ HTTP/1.1" 200 16

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

WordPressを設置した際の動作

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

127.0.0.1 - - [07/Mar/2018:15:26:25 +0900] "GET /cakephp3/wp HTTP/1.1" 301 371
127.0.0.1 - - [07/Mar/2018:15:26:25 +0900] "GET /cakephp3/webroot/wp/ HTTP/1.1" 404 50817

 

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

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

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

「.htaccess」ファイルを修正

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

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

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

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

<IfModule mod_rewrite.c>
    RewriteEngine On
    #ディレクトリが存在するかチェック
    RewriteCond %{REQUEST_FILENAME} !-d

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]

    #webrootが付与されていたらwebrootを除外してリダイレクトさせる
    RewriteCond %{THE_REQUEST} "^(.+?) (.*?)/webroot/(.*?) (.+?)$"
	RewriteRule ^(.*?)$ %2/%3 [R=301,L,NE]
</IfModule>

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

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

127.0.0.1 - - [07/Mar/2018:15:50:05 +0900] "GET /cakephp3/test HTTP/1.1" 301 372
127.0.0.1 - - [07/Mar/2018:15:50:05 +0900] "GET /cakephp3/webroot/test/ HTTP/1.1" 301 364
127.0.0.1 - - [07/Mar/2018:15:50:05 +0900] "GET /cakephp3/test/ HTTP/1.1" 200 16

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

最後に

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

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

コメント

コメントを残す

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