今日も元気に障害対応〜。
本日のお題は、「勝手にログアウトされちゃう」問題。
ログアウト操作をしたわけでもないのに、なぜかログインクッキーがクリアされてしまう。
現象の再現条件は以下のようなものでした。
- 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]
をデフォにしなきゃダメだね、と思ったのでした。