[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ログをチェックします。
静的ファイルにアクセスしたログ
生定期ファイルにアクセスした際のログになります。
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/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/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を記述してあげる必要があります。
コメント
コメントを残す