サブドメインとセッション・クッキーの不具合についての覚書です。
前日深夜から本日昼過ぎまで、はまってしまいました。
【問題点】
メインのドメインとサブドメインでセッション・クッキーの挙動がおかしくなる。それも、インターネット・エクスプローラー(ie9)のみで。
具体的には、会員サイトにおいて、メインのドメインではログインができるが、サブドメインではログインができなくなるという不具合。
【原因】
調べてみると、原因は、インターネット・エクスプローラー(ie)等のいくつかのブラウザで、メインドメインのクッキーと、サブドメインのクッキーを、区別せずに、両方受け入れてしまうことによる不具合と判明。
【具体例】
■ example.com・・・server1で運用 ■ sub.example.com・・・server2で運用
この状態でメイン・サブのドメインを運用する場合、本来は、次のようなセッション・クッキーのやりとりに限定されるものです。
//正常時
■ example.com
・・・PHPSESSID=abcccccccccc
■ sub.example.com
・・・PHPSESSID=xyzzzzzzzzzz
セッション・クッキーが、きちんと分かれています。
ところが、インターネット・エクスプローラー(ie)だと、サブドメインにおいて、メインのものとサブのもの両方のクッキーがやりとりされてしまいます。
//異常時 ■ example.com ・・・PHPSESSID=abcccccccccc ■ sub.example.com ・・・PHPSESSID=xyzzzzzzzzzz ・・・PHPSESSID=abcccccccccc
なぜか、サブドメインにおいて、メインのセッションクッキーのやりとりもされてしまってます。
このため、メインドメインとサブドメインとの間で、クッキーの値の上書き等が行われ、本来あるべきセッションファイルとセッションクッキーの不一致が生じ、会員サイトなどでは、ログインが不可能となるのです。
【対策】
この不具合の症状を回避するための一つの方策としては、セッション名を変更する方法が考えられます。
■ example.com ・・・PHPSESSID=abcccccccccc ■ sub.example.com ・・・SUBSESSID=xyzzzzzzzzzz
上記のように、サブドメインのセッション名をメインのものとは異なるものに設定してやります。
具体的なコーディングとしては、PHPの場合、session_name関数を利用します。
http://www.php.net/manual/ja/function.session-name.php
サブドメインのサイトにおいて、次のようにしてやります。
session_name("SUBSESSID");
たったこれだけで、セッション名を変更することができます。
メインのセッション名は、デフォルトでは、PHPSESSIDなので、こうしてやることで、セッション名の衝突を回避することができます。
なお、セッション名を変更しても、サブドメインにおいて、メインのセッション・クッキーがやりとりされてしまっていることに変わりがないことには注意が必要です。
以上です。