ChromeでURLルートディレクトリにfavicon.icoが無いとセッション切れする
タイトルの件が発生したので、メモ。
Chromeでセッション切れ発生
とあるWebシステムで、Chromeでアクセスした際に、ログイン後の画面から別の画面へのリンクをクリックすると、ログイン画面に戻される。 再ログインした後の画面から別の画面へのリンクをクリックすると、またログイン画面に戻される。
開発環境では発生せず、ステージング環境で発生してしまう。
とりあえず、Cookieを見る
ChromeのデベロッパーツールでCookieの値を確認してみる。 ログイン後の画面でのセッションキーの値と、リンクをクリックした際に戻されたログイン画面でのセッションキーの値に相違があることが判明。 セッションキーの値が変わっているので、ログインセッションが切れたようです。
原因がさっぱりわからなかったので、google先生に聞いてみました。
favicon.ico が原因?
google先生に聞いてみると、 どうやらfavicon.icoが無いとセッション切れするらしい。
chromeでは、linkタグにfavicon.icoの指定がなければ、 URLルート直下にfavicon.icoにあるものと判断し、そこから取得しようとするようです。
favicon.icoファイル自体は存在していて、 開発環境ではURLルート直下にあるので、開発環境ではChromeでログインセッションが保たれているようです。 ステージング環境ではサブディレクトリ配下でアプリケーションが動いているため、 URLルート直下ではなく、サブディレクトリにfavicon.icoがあるからステージング環境で発生してしまう。
例えば、linkタグでfavicon.icoを指定してあげるようにすると、解決する。
<link rel="shortcut icon" href="/hoge/foo/bar/favicon.ico" />
開発環境とステージング環境では、favicon.icoのURLが異なるため、 そこはうまいこと指定できるようにしてあげました。
本アプリはRailsだったので、favicon_image_tag
ヘルパーを使って対応しました。
Rails3以降で使えるヘルパーなので、
Rails2以前では、ActionController::Base.relative_url_root
やrequest.relative_url_root
等をうまく使って対応できそう。
それにしても、favicon.ico取得で404エラーすると、セッション切れちゃうのは、 何だか気持ち悪いですけどね。