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で記述する場合は、以下の通りとなります。
1 2 3 |
<link rel="shortcut icon" href="/images/favicon.ico" /> <link rel="apple-touch-icon-precomposed" href="/images/apple-touch-icon-144-precomposed.png" sizes="144x144" /> |
上記と同様の記述を CakePHPの HtmlHelperを利用して記述する場合は、以下の通りとなります。
1 2 3 4 5 |
<?php echo $this->Html->meta('icon', '/images/favicon.ico'); echo $this->Html->meta('apple-touch-icon-144-precomposed.png', '/images/apple-touch-icon-144-precomposed.png', array("size"=>"144x144")); ?> |
いずれの方法を使うにしても、「<head> ... </head>」の間のどこかに記述します。
この記述を追記する際に注意するポイントは、相対パスで記述するのではなく、フルパスで記述する(「/」から書き始める)、ということです。
CakePHPで linkタグ、HtmlHelper::metaを利用する方法についての解説
先に説明した対処方法について、以降で詳しい解説をしていきます。
favicon.icoやapple-touch-icon-144-precomposed.pngが could not be foundのエラーを出力した経緯
CakePHPに、会員管理プラグイン「CakeDC/Users」を導入したサイトの開発を行っています。
その際、下記の様なエラーがエラーログに出力されていることに気づきました。
1 2 3 4 5 6 7 8 9 |
2018-04-01 01:01:01 Error: [MissingControllerException] Controller class ImagesController could not be found. Exception Attributes: array ( 'class' => 'ImagesController', 'plugin' => NULL, ) Request URL: /admin/images/apple-touch-icon-144-precomposed.png Stack Trace: #0 /var/www/html/example/app/webroot/index.php(110): Dispatcher->dispatch(Object(CakeRequest), Object(CakeResponse)) #1 {main} |
1 2 3 4 5 6 7 8 9 |
2018-04-01 02:02:02 Error: [MissingControllerException] Controller class ImagesController could not be found. Exception Attributes: array ( 'class' => 'ImagesController', 'plugin' => NULL, ) Request URL: /admin/images/favicon.ico Stack Trace: #0 /var/www/html/example/app/webroot/index.php(110): Dispatcher->dispatch(Object(CakeRequest), Object(CakeResponse)) #1 {main} |
エラーログの内容を解説すると以下の通りです。
「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行目付近のソースコードは以下の通りです。
106 107 108 109 110 |
$Dispatcher = new Dispatcher(); $Dispatcher->dispatch( new CakeRequest(), new CakeResponse() ); |
これは、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」までのパスを上記のように相対パスで記述していたとします。
1 |
<link rel="shortcut icon" href="images/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タグ」の記述は、以下のようになります。
リンクを記述する際のポイントは、「/」からフルパスで書き始めることです。
1 |
<link rel="shortcut icon" href="/images/favicon.ico" /> |
上記のように、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 |
HtmlHelper::meta(string $type, string $url = null, array $options = array()) |
一番簡単な記述方法としては、以下のようになります。
1つ目のパラメーターにファイルのタイプを指定し、2つ目のパラメーターにファイルのパスを指定します。
1 |
echo $this->Html->meta('icon', '/images/favicon.ico'); |
処理されて出力される linkタグは以下のようになります。
1 |
<link href="/images/favicon.ico" type="image/x-icon" rel="icon" /><link href="/images/favicon.ico" type="image/x-icon" rel="shortcut icon" /> |
また、タイプやオプションの指定内容によって少しずつ編集される内容が変わってきます。
それを実験した内容が下記になりますので参考にしてみてください。
1 2 3 4 5 6 |
echo $this->Html->meta('favicon.ico', '/images/favicon.ico'); // ↑このように記述すると、 // ↓こう編集されます <link href="http://example.com/images/favicon.ico" type="application/rss+xml" rel="alternate" title="favicon.ico" /> |
1 2 3 4 5 6 |
echo $this->Html->meta('favicon.ico', '/images/favicon.ico', array("type"=>"icon")); // ↑このように記述すると、 // ↓こう編集されます <link href="/images/favicon.ico" type="image/x-icon" rel="icon" /><link href="/images/favicon.ico" type="image/x-icon" rel="shortcut icon" /> |
1 2 3 4 5 6 |
echo $this->Html->meta('apple-touch-icon-144-precomposed.png', '/images/apple-touch-icon-144-precomposed.png', array("size"=>"144x144")); // ↑このように記述すると、 // ↓こう編集されます <link href="http://example.com/images/apple-touch-icon-144-precomposed.png" type="application/rss+xml" rel="alternate" title="apple-touch-icon-144-precomposed.png" size="144x144" /> |
GoogleAdwords
GoogleAdwords
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!
関連記事
-
-
CakePHPで Auto Incrementを外すと Duplicate entry ‘0’ for keyのエラーが出るかも
CakePHPでAuto Incrementの設定を変更したときに「Duplicate entry ‘0’ for key」のエラーが出た。原因はModel内で IDを編集する処理の追加を忘れていたからだった。
-
-
CakePHP4のCSS、JavaScript、画像のブラウザへのキャッシュをコントロールする
CakePHP4、CakePHP3でブラウザにキャッシュさせる設定の解説。CSS、JavaScript、画像をブラウザにキャッシュさせるのか、定期的にリロードする設定にするのかの設定が可能。
-
-
CakePHP 2.3 Model、Controllerの見たい変数の中身をログ出力
CakePHPの Modelや Controllerの変数の中身をログとして出力して見る方法を提供します。
-
-
CakePHP3のインストールでURL rewriting……のエラーが!その解決方法解説
CakePHP3をインストールしたら URL rewriting is not properly configured.のエラーが。原因は.htaccessが有効になっていないこと。httpd.confに設定を追加すればOK。
-
-
CakePHP4、5のユーザ認証でID、PASS以外の削除フラグなども条件加える方法
CakePHP4系、5系ではAuthenticationを使用してログイン認証を行う。その認証でID、PASS以外の削除フラグなどの条件を加えたいときの対応方法について解説。
-
-
CakePHP3のCakeDC/UsersのUserHelperでログアウトやreCAPTCHAをカスタマイズ
CakeDC謹製Usersプラグインの紹介。UserHelperを利用し、ログアウトのリンクや権限があるときのみ表示されるリンク、プロフィールページへのリンク、reCAPTCHAの設置方法などを解説。
-
-
CakePHP4のフラッシュメッセージの表示場所、デザインを変更する方法を解説
CakePHP4のエラーメッセージ、完了メッセージなどを表示するフラッシュ処理の解説。Controller、レイアウトファイル、テンプレートファイルでそれぞれ処理を指定する。
-
-
CakePHP3でデフォルトのソート条件を設定してユーザの選択肢たソート条件を有効にする方法
CakePHP3でデフォルトのソート条件を設定しつつ画面上でユーザがソート条件を選択したときもソート処理を実行させる方法を解説。ソート条件はページネーションの処理として実装。
-
-
CakePHP3でQRコードを作成、表示するライブラリ「cakePHP-QR-Code-Helper」
CakePHPでQRコードを生成するライブラリ「cakePHP-QR-Code-Helper」の紹介。GDライブラリのインストールも必要ないHelperとして提供されているため、ファイルを設置すればすぐに使用可能。
-
-
CakePHP3でcomposerを利用してライブラリ・プラグインをインストールする方法
CakePHP3でcomposerを使ってパッケージ(ライブラリ、プラグイン)をインストールする方法の解説。PHPを使うのはCakePHP3が初めてというような方への使い方から解説。