2008年02月03日

Sleipnirのfaviconで苦戦

Sleipnirでルート直下にFavicon置いている環境で、一部のページだけにhtmlのヘッダのlinkタグで別のFaviconを表示させようとしたところ、どうやってもルート直下の方のFaviconを読み込んでしまって苦戦。

ただ、IEでは問題なく表示されるのできっとSleipnir側の問題と判断して、色々試してみたんですが、どうにもうまく行かない。

と言うか、自分しか使わないサイトでタブの見分けようにアイコン付けたかっただけだったので、Sleipnirの設定フォルダの「\caches\favicon」にあるキャッシュを細工して一時しのぎを行うことにしました。

ただ、この「\caches\favicon」フォルダにあるfaviconのキャッシュの命名ルールがわからなくてここでも苦戦。

桁数からMD5だろうと当たりをつけて調べ始めたんですが、キーがさっぱりわからず・・・

と言うか、ざっと考えつくだけでも

  • プロトコルの有無
  • ホスト名の取り扱い(IPなのか、ホスト名なのか)
  • ポート番号の有無
  • 区切り文字の有無
  • 文字コード(UTF-16ではASCII文字でも
    文字コード違いますし)
  • URLエンコードの有無
  • その他、記号の置換・削除など
と言った可能性があるので、思いつくパターン試すだけでも日が暮れそうな感じです。

で、しばらく頑張ってみたんですが、どうも自力で見つけられそうな気配がなかったので、ネットで調べてみたところ、命名ルールを調べるヒントがありました。

と言うことで、早速上記のzipファイルをダウンロードして色々確かめてみたところ、以下のようにしているようでした。
  1. ページのURLでFaviconキャッシュを探して、見つかれば即利用
  2. 無ければ、HEADのlinkタグを見て、faviconの記載があれば利用→キャッシュに保存
  3. 無ければ、閲覧中のホスト名でFaviconキャッシュを探して、見つかれば即利用
  4. 無ければ覧中のホストのルート直下のfavicon.icoファイルを探してあれば利用
なお、キャッシュの命名規則生成にはSleipnir.APIのGetUrlHashと言う関数が利用されており、ページのアイコンキャッシュのキーにはURL(ただし、?や#以下を除去した物)、ホストのアイコンキャッシュのキーには入力されたURLのホスト名の部分のみが利用されていました。

(つまり、ホストの方のキャッシュはプロトコルとかポートとか意識しないので、同じポートで開いている場合や、SSLと平文で別のサイトを表示する場合でも区別されないことになります。)

で、その調査をしながら上記のスクリプトで目的のアイコンキャッシュを作成して無事表示され一段落付いたのですが、その後、FireFoxでlinkタグを記載したサイトを開いてみたところ、こちらもやはり表示されず。

これはおかしいと思って、さらに調査したところ、サーバがちゃんとしたMIMEヘッダと送出してないことに気が付いたので「image/vnd.microsoft.icon」を送出するように変更。

でも改善無し(;´д`)ノ

もしかして、用意したFaviconの形式がおかしいかなぁと、さらに色々調べていた所、

「あれ? このソース、ヘッダに<link rel="SHORTCUT ICON" href="favicon.ico" />が二つ無い?」

しかも、後者はfaviconのURIに何も指定されていませんでした。

もしやと、後者を削除してみたところ、FireFoxでは問題なく表示されるようになりました。

これはと思い、いっぺんFaviconのキャッシュを削除したSleipnirでサイド試してみたところ、こちらもさっくりと表示されましたorz

つまり、IEはlinkの設定が二つあっても気にしなかったようですが、SleipnirとFirefoxは二つあると後者が有効になるようです。

もっと早く気が付け<自分(ノ `Д´)ノ===┻━┻

と言う訳で、今は何問題なく表示されるようになりました( ̄▽ ̄)ノ

そうそう、上記の件を調べている最中におもしろ記事を見かけたので合わせてメモしておきます。

  • ん? href 属性の値は URI…URI だから URL も含んでるよな…んじゃぁ URL スキームだと何でもいいんじゃないか?だったら data: スキーム 1 でも表示できなければオカシイんじゃないか?
要するにhtmlだけあればFireFoxやOperaではfaviconが表示されると言うことですが、肝心のIEが未対応なので微妙かなぁと言う感じになっています。

Posted by Takuchan at 2008年02月03日 13:34 | トラックバック(0)