にしし ふぁくとりー(西村文宏 個人サイト)

Presented by Nishishi via Movable Type. Last Updated: 2017/07/09. 10:57:10.

サーバログにapple-touch-icon系URLの404エラーが多数記録されるので対策をしてみた記録

ウェブサーバのアクセスログ(のうちエラーログ)を眺めていると、apple-touch-icon-120x120-precomposed.png だとか apple-touch-icon.png などのURLにアクセスが多数あり、すべて 404 Not Found としてエラーが記録されています。
これらは、iPhoneなどで使われているiOSがホームアイコン画像を探すために問答無用でアクセスしてくるURLです。PC版ブラウザがfavicon.icoに問答無用でアクセスを試すのと同じです。
昔からよくあるエラーで、特に問題になるわけではないので放置していました。

ただ、やっぱりエラーログを眺めるときに、こういうどうでもいいエラーがあると煩わしいですし、何より毎回404 Not Foundページを返すと、サーバの転送量が無駄に増えてしまうので、何か軽いアイコンを1つ用意しておく方が良さげだな、と思い直しました。^^;

エラーログを見てみると、だいたい1回のアクセスで、以下の4つのURLに連続してアクセスがあります。

File does not exist: /home/nishishi/www/apple-touch-icon-120x120-precomposed.png
File does not exist: /home/nishishi/www/apple-touch-icon-120x120.png
File does not exist: /home/nishishi/www/apple-touch-icon-precomposed.png
File does not exist: /home/nishishi/www/apple-touch-icon.png

どうも一部のiOS端末では、

  1. 最初に apple-touch-icon-120x120-precomposed.png が存在するかどうかをチェックして、
  2. なければ次に apple-touch-icon-120x120.png が存在するかどうかをチェックして、
  3. なければ次に apple-touch-icon-precomposed.png が存在するかどうかをチェックして、
  4. なければ最後に apple-touch-icon.png が存在するかどうかをチェックする。

……というような動作をするみたいですね。
ただ、端末によっては上記の3~4だけにしかアクセスしないものも(エラーログからは)見えましたが。

毎回アクセスされる度に、都合4回の404 Nout Foundエラーが発生するのはなんとも無駄です。
うちのサイトで404エラー用に用意しているページはだいたい3.4KBあるので、(連続4回発生するとなると)毎回13.6KBも意味のないデータを返してしまいます。
それならば、放置するよりも何か小さいアイコンを用意しておく方が無駄な転送が発生しなくて済むよな、と思いました。
そもそも、アイコンの存在が見つかればそのiOS端末はアイコンデータをキャッシュするでしょうから、次からのアクセス頻度が減るかもしれませんし。

というわけで、iOS用のホームアイコン画像を作って1つ用意しておくことにしました。

iOSホームアイコン画像のファイル名をどうするか?

iOS端末が問答無用で探すホームアイコン画像のファイル名は、上述の通り4種類ありました。
でも、もしかしたら端末によってはもっと別のファイルも探すのかもしれません。
とすると、ホームアイコン画像を作っておくとしても、どんなファイル名で用意するか? という問題があります。

  • 最も共通するファイル名は apple-touch-icon.png のようですが、このファイル名1つを用意したところで、それよりも前に数回ほど404エラーが発生してしまうのであまり意味がありません。
  • しかし、apple-touch-icon-120x120-precomposed.png のファイル名で用意すると、このファイル名をチェックしないような古い端末や、このファイル名よりも前に別のファイル名を探そうとするような端末では、やはり404エラーが発生してしまいます。
  • 先述の4つのファイル名で用意しておけば良いと言えなくもないですが、4つだけで足りるとは限りませんし、何より余計なファイルをサーバ上に多数置くことになるのはなんだかスマートではありません。

というわけで、以下の対処方法を考えました。

  • ホームアイコン画像の実体は1つだけを用意しておく。
  • どのファイル名でアクセスされても同じファイルの中身を返すよう.htaccessファイルを記述する。

これなら、サーバ上に置くホームアイコン画像は1つだけで済み、iOS端末側がどのファイル名に先にアクセスしても、最初の1回で画像を返すことができるので、404 Not Foundエラーの発生を回避できます。

iOSホームアイコン画像と.htaccessファイルの記述

まず、apple-touch-icon.png というファイル名でアイコン画像を1つ用意しました。
で、.htaccessファイルにはmod_rewriteを使って以下のように記述しました。

RewriteEngine on
RewriteRule ^apple-touch-icon-.*?\.png$ /apple-touch-icon.png [L]

上記(の2行目)では、リクエストされたURLが「apple-touch-icon-」で始まっていて「.png」で終わっている場合に、apple-touch-icon.pngファイルの中身を返すよう指示しています。(リダイレクトはしません。)
※前半の[書き換え前]側には先頭にスラッシュ記号は不要です。後半の[書き換え後]側には先頭にスラッシュ記号が必須です。

これなら、

  • apple-touch-icon-120x120-precomposed.png をリクエストされても、実際には apple-touch-icon.png の中身が返されます。(URLはそのまま)
  • apple-touch-icon-120x120.png をリクエストされても、実際には apple-touch-icon.png の中身が返されます。(URLはそのまま)
  • apple-touch-icon-precomposed.png をリクエストされても、実際には apple-touch-icon.png の中身が返されます。(URLはそのまま)
  • apple-touch-icon.png がリクエストされた場合は、そのファイル名で実体が存在するので、そのファイルの中身がそのまま返されます。

確認したエラーログでは上記の4ファイルしかリクエストされていなかったんですが、ググってみると他のファイル名でのアクセスがある可能性もあるっぽいですね。例えば apple-touch-icon-72x72.png とか apple-touch-icon-152x152.png とか。
それらのファイル名でリクエストがあった場合も、すべて apple-touch-icon.png の中身を返します。(^_^;)

アイコンサイズは全部一緒になるけども……

今のところ、私は apple-touch-icon.png を120×120サイズで作りました。
なので、iOS側がどんなサイズのアイコンをリクエストしたとしても、全部120×120サイズで返ります。
もしかしたら表示上の不具合が出るかもしれません。

……でもですよ、そもそも、私のウェブサイトをiOS端末のホーム画面に常に表示させておこう、などと考える方々が居るとは思えないんですよね。(^_^;;;
なので、たぶんこの画像をホームアイコン画像として実際に使うユーザが居ないと考えて問題ないと思っています。単に、iOS端末が問答無用でアクセスしてくるだけであって。

というわけで、たぶんこの方法で何も問題はないのではないかと考えています。(^_^;)
どうかな。^^;

コメント

コメント数: 0件

コメント投稿欄 この日記に対するコメント投稿を歓迎します。



※本文中にURLは書けません。(書くと投稿が拒否されますのでご注意下さい。)

※ご投稿頂いた内容は、掲載前に管理者が確認する設定にしている場合があります。たいていは数日以内には表示されるはずですので、気長にお待ち願います。m(_ _)m

著者紹介


にしし(西村文宏)

にししでございます。本書いたり記事書いたりしてます。あと萌えたり。著書5冊発売中です(Web製作系4冊+小説1冊)。著書や記事は「西村文宏」名義。記事は主にAll Aboutで連載。本の最新刊は2011年3月に発売されたライトノベルでございますよ。

Twitter:にしし/西村文宏
にしし/西村文宏 on facebook にしし/西村文宏 on mixi にしし/西村文宏 on Google+ フォローはお気軽に!

にしし(西村文宏)連絡先
☕ コーヒーをおごる

著書一覧と詳細

関連する記事など

※下記には、本サイト内外の関連記事などが8本くらい自動で表示されています。

にししふぁくとりー Sakura scope内限定での主要なカテゴリ

--- 当サイト内を検索 ---