2012年6月13日

Firefoxはlink relを先読みする模様


今日も元気に障害対応〜。

本日のお題は、「勝手にログアウトされちゃう」問題。
ログアウト操作をしたわけでもないのに、なぜかログインクッキーがクリアされてしまう。
現象の再現条件は以下のようなものでした。

  • Firefoxだけで起きる
  • サイトはWordPressで構築されている
  • 特定のページを開いた時に、100%再現する

原因がわからず、Firefoxのクッキーストアである「cookies.sqlite」を消したりいろいろやってみたのだが、解決しない。
うーん、なんだろうってんで、とりあえずHTMLソースを見てみた。
すると、HTMLヘッダに

[cc lang=”html”] [/cc]
なんてのが。
WordPressだから、同一カテゴリーの次のページをご案内しておきましょう、ということである。
怪しい。ので出力させないようにしてみよう。

このへんは、WordPress的にはwp_head()が出力している。
具体的には、wp_head()で呼ばれる「adjacent_posts_rel_link_wp_head」というアクションである。
なので、テーマのfunctions.phpに

[cc lang=”php”]
remove_action(‘wp_head’, ‘adjacent_posts_rel_link_wp_head’);
[/cc]

を追加してやれば、このlink要素は出力されなくなる。

結論。これで解決。
どうやら、Firefoxはlink要素で指定された「前ページ」「次ページ」を先読みしているらしい。
先に読んでキャッシュしとけば、「次のページ」を開いた時に「お!さすがFirefox。速いね〜。」ってなるからだろうと推測される。
だが、「次ページ」として指定されたページが動的なページだった場合、そのページを踏んでもいないのに、意図せずその処理が実行されてしまう。

Firefox的には、単にURL叩いただけで実行するのはリスキーなんだから、ワンタイムなハッシュでも渡して制御しろと言うのだろうし、まあそれは正しいのだが、だからといってユーザが開いてもいないページに勝手にアクセスするってのはいかがなものか。
サーバ側から見ても、無駄にトラフィックが増えて迷惑な話である。

そんなわけで、WordPressを使って動的なサイトを構築する場合は、

[cc lang=”php”]
remove_action(‘wp_head’, ‘adjacent_posts_rel_link_wp_head’);
[/cc]

をデフォにしなきゃダメだね、と思ったのでした。


[社長ブログ]