エス技研

WordPress、CakePHP、PHP、baserCMSなどの Web系システムを中心に情報を提供します!


CakePHPで favicon.icoやapple-touch-icon-144-precomposed.pngが could not be foundのエラーが出るときの対処方法

      2019/03/02

CakePHPで favicon.icoやapple-touch-icon-144-precomposed.pngを設定する

 

CakePHPで linkタグを設定。HtmlHelper::metaの利用方法も解説

 
CakePHPで構築したシステムで、「Error: [MissingControllerException] Controller class ImagesController could not be found.」というメッセージとともに「favicon.ico」や「apple-touch-icon-72-precomposed.png」や「apple-touch-icon-144-precomposed.png」などのファイルが存在しない、というエラーが出力される場合があります。
 
 
その時は、「/app/View/Layouts/default.ctp」に下記の記述を追加しましょう。
 
HTMLで記述する場合は、以下の通りとなります。
 

 
 
上記と同様の記述を CakePHPの HtmlHelperを利用して記述する場合は、以下の通りとなります。
 

 
いずれの方法を使うにしても、「<head> ... </head>」の間のどこかに記述します。
 
 
この記述を追記する際に注意するポイントは、相対パスで記述するのではなく、フルパスで記述する(「/」から書き始める)、ということです。
 
 

CakePHPで linkタグ、HtmlHelper::metaを利用する方法についての解説

 
先に説明した対処方法について、以降で詳しい解説をしていきます。
 
 

favicon.icoやapple-touch-icon-144-precomposed.pngが could not be foundのエラーを出力した経緯

 
CakePHPに、会員管理プラグイン「CakeDC/Users」を導入したサイトの開発を行っています。
 
その際、下記の様なエラーがエラーログに出力されていることに気づきました。
 

 

 
 
エラーログの内容を解説すると以下の通りです。
「ImagesController」が見つかりませんでした。
エラー発生のリクエスト URLは「/admin/images/apple-touch-icon-144-precomposed.png」「/admin/images/favicon.ico」です。
 
また、エラーが発生した個所は「/var/www/html/example/app/webroot/index.php」の 110行目です。
という内容です。
 
 
ちなみに、「/example/app/webroot/index.php」の 110行目付近のソースコードは以下の通りです。
 

 
これは、CakePHPの Bakeで作成されるデフォルトの状態と変わらないものです。
 
また、index.phpは 上記の 110行目で終了しています。
そのため、110行目は、ファイルの最後の「);」と言ことになるのですが、これでは何が原因でエラーになっているのかが分かりません。
 
 

「CakeDC/Users」を使った会員管理システムである

 
また、このシステムでは、最初にも書きましたが「CakeDC/Users」を使ってログインが必要なシステムになっています。
一般ユーザ(Member)と、管理者ユーザ(admin)とに画面が分かれています。
 
そして、「一般ユーザ(Member)」の URLは下記のものになりますが
 https://example.com/login
 
「管理者ユーザ(admin)」の URLは、下記の様に自動的に「admin」が付与されるようにルーティングされています。
 https://example.com/admin/login
 
この「admin」が付与されるルーティングは「CakeDC/Users」をインストールする過程で設定します。
 
「CakeDC/Users」に関しては下記に記事を書いていますので、参考にしてください。
CakePHP3のユーザ管理・ログイン認証プラグインCakeDC/Usersのインストール解説・3.6以降対応
 
 
今回の不具合の原因は、この「CakeDC/Users」のログインに関連したルーティングの処理で発生しているのです。
 
 

テンプレートファイルや画像、CSS、JSのリンクもルーティングされる

 
「CakeDC/Users」などでルーティング処理がされる際、「/app/View/Layouts/default.ctp」を始めとするテンプレートファイルのファイル名や、テンプレートにある画像ファイル、CSSファイル、JSファイルへのリンクもルーティングの処理がされるのです。
 
 
より具体的には、下記のように「favicon.ico」までのパスを上記のように相対パスで記述していたとします。
 

 
 
この場合、「一般ユーザ(Member)」でアクセスしたときは下記になりますが、
/images/favicon.ico
 
「管理者ユーザ(admin)」でアクセスしたときは、ルーティングの設定があるため、下記の様に「/admin」が追加されてしまうのです。
/admin/images/favicon.ico
 
 
「一般ユーザ(Member)」と「管理者ユーザ(admin)」とで全く画面のイメージが違うために、「/images/」と「/admin/images/」を別々に用意している場合はこれでも問題ないのだと思います。
ですが、今回構築していたシステムは、基本的な画面イメージはどちらもほぼ同じで、登録、更新の機能が違うという程度でしたので、管理者ユーザ側の画像ファイルも含めて、すべて「/images」に入っている状態でした。
 
そのために、「管理者ユーザ(admin)」でアクセスをすると、画像のフォルダも「/admin/images/」にルーティングされることで、「ファイルがない」というエラーにつながるという結果になっていました。
 
 

ルーティング処理されるパスの問題点の解消方法

 
先にも書きましたが、このルーティングされる際に画像などのパスもルーティングされてしまう問題点の解消方法は、画像フォルダのパスの指定を、相対パスではなく、「/」から始まるフルパスで記述しておくことです。
 
 
ちなみに、もう一つ私がはまった点としては、テンプレートとして使用しているファイルが一つだけではなかった、という点です。
 
標準的には、テンプレートファイルは「/app/View/Layout/default.ctp」になりますので、このファイルのパスを変更します。
 
ですが、私がメンテナンスをしていたシステムには、「default.ctp」のほかに管理画面用の「admin.ctp」がありまして、こちらのパスも相対パスで記述されていました。
そのため、「default.ctp」だけを変更して動作確認しても、エラーが出続けるという状況になっていました。
 
その他、「login.ctp」「error.ctp」といったテンプレートを作っている場合もあるでしょうから、その他のテンプレートも確認してみることをおススメします。
 


 

favicon.icoによって could not be foundのエラーが出るときの対処方法のまとめ

 
「favicon.ico」のリンクを指定する「linkタグ」の記述は、以下のようになります。
リンクを記述する際のポイントは、「/」からフルパスで書き始めることです。
 

 
 
上記のように、CakePHPでも直接 HTMLの linkタグを記述しても全く問題はありませんが、CakePHPの HtmlHelperを使って書くこともできます。
HtmlHelperを使って書くとちょっとカッコよく見せることもできる!という感じです。
 
 

HtmlHelper::meta()の使い方

 
HtmlHelperを使って linkタグを記述する場合は「HtmlHelper::meta()」を使用します。
 
詳細は、下記の Cookbookにもあります。
 
CakePHP 2.x Cookbook HtmlHelper
https://book.cakephp.org/2.0/ja/core-libraries/helpers/html.html
 
 
HtmlHelper::meta()は、下記の形式で使用します。
 

 
一番簡単な記述方法としては、以下のようになります。
1つ目のパラメーターにファイルのタイプを指定し、2つ目のパラメーターにファイルのパスを指定します。
 

 
処理されて出力される linkタグは以下のようになります。
 

 
 
また、タイプやオプションの指定内容によって少しずつ編集される内容が変わってきます。
それを実験した内容が下記になりますので参考にしてみてください。
 

 
 

 
 

 - CakePHP 3.x 4.x 5.x

GoogleAdwords

GoogleAdwords

最後までお読みいただきましてありがとうございます。
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!

Message

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

下記の空欄を埋めてください。 * Time limit is exhausted. Please reload CAPTCHA.

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

※入力いただいたコメントは管理者の承認後に掲載されます。

  関連記事

CakePHP3のメール送信の処理・テンプレート使用・添付ファイル送信も解説
CakePHP3のメール送信の処理・テンプレート使用・添付ファイル送信も解説

CakePHP3からメールを送信する方法解説。基本的な記述方法を基にして、テンプレートを使う方法、ファイルを添付する方法へと拡張しながら解説。

CakePHP5でヘルパーから他のヘルパーを読み込む方法・CakePHP4からの変更点
CakePHP5でヘルパーから他のヘルパーを読み込む方法・CakePHP4からの変更点

CakePHP5のヘルパーで他のヘルパーを読み込む方法を解説。公式の日本語CookbookはCakePHP4のソースのままで間違っているため注意が必要。CakePHP4からの移行の際も同じ点に注意が必要。

CakePHP3のCakeDC/Usersのバリデーションのカスタマイズ方法解説
CakePHP3のCakeDC/Usersのバリデーションのカスタマイズ方法解説

CakeDC謹製Usersプラグインの紹介。Usersのカスタマイズとして入力項目のバリデーションの変更を、プラグインのファイルは触らずオーバーライドにより実装する方法を解説する。

CakePHP3の更新画面でUpload Plugin 3.0を使う方法、viewで使う方法解説・その3
CakePHP3の更新画面でUpload Plugin 3.0を使う方法、viewで使う方法解説・その3

CakePHP3でファイル、画像をアップロードするプラグイン、upload plugin 3を導入する手順を解説した記事。3部作のその3で記事を更新する際のファイルの取り回しなどについてを解説。

CakePHP3でシェルを作成しコマンドラインから実行・CakePHP2との違い
CakePHP3でシェルを作成しコマンドラインから実行・CakePHP2との違い

CakePHP3のシェルスクリプトを作成し、コマンドラインから実行する方法を解説。複数単語をつなげる場合の対応方法がCakePHP2より制限が厳しくなったのでCakePHP3の命名規則の確認が必要だ。

CakePHP3でページごとに読み込むJavaScript、CSSを変える処理の解説
CakePHP3でページごとに読み込むJavaScript、CSSを変える処理の解説

CakePHP3でJavaScriptやCSSを編集する基本形から、それらやテンプレート(エレメント)を特定のテンプレートを読み込んだときのみ編集、実行するための方法、ブロック化について解説。

CakePHP 2.3でファイルをアップロード・その2 ファイル名を乱数で設定

CakePHPのアップロードするファイル名を乱数で変更しセキュリティを高める方法を解説。

CakePHP3でファイルのアップロード処理を自作・解説付き・その1
CakePHP3でファイルのアップロード処理を自作・解説付き・その1

CakePHP3でファイルをアップロードする処理を、php.netにある「エラーを起こさない」と説明がある処理を参考に作成。サンプルソースとその解説付きで、コピペでも動くし、カスタマイズも簡単!

CakePHP3の1対多での連携を中間テーブルを使った多対多の連携に変更するときの手順
CakePHP3の1対多での連携を中間テーブルを使った多対多の連携に変更するときの手順

CakePHP3で「1対多」の連携を中間テーブルを利用した「多対多」の連携に変更するときの手順のまとめ。中間テーブルの設定やModelの変更などを間違いやすい箇所を指摘しながらの解説。

CakePHP 2.3 Search Pluginで検索処理 その3入力エリア一つで複数の項目を同時に検索する方法

CakePHPの検索プラグイン Search Pluginの検索処理の中で入力エリア一つで複数の項目を同時に検索する方法を解説。