$_COOKIEはphpではとても便利なものですが、同じドメイン名の下に異なるサブドメイン名が存在する場合があり、Cookieが1つしか保持されないという問題が発生することがありますのでご紹介します。
PHP のスーパーグローバル変数 $_COOKIE は非常に便利ですが、場合によっては混乱を引き起こす可能性もあります。たとえば、ルート ドメインとサブドメインに同じ名前の Cookie があり、$_COOKIE に保存できるのはどれか 1 つだけです。
RFC では、精度が最も高く、最も長いものを使用することを推奨していますが、ブラウザーによって処理方法が異なります。 Chrome のみをテストしました。このように、PHP はルート ドメインとサブドメインにある同じ名前の Cookie のみを受信し、それ以降の Cookie は無視されます。間違った値を受け取りやすくなります。 Safari は RFC の推奨事項に従っており、個人的にはテストされておらず、他のブラウザでもテストされていないと言われています。
まず、SwitchHosts: www.bKjia.c0m を通じて仮想ドメイン名を設定し、Web サーバーを設定します。もちろん、Hosts ファイルを手動で設定することもできます。さらにいくつかのツールを紹介します。
次に、Cookie を設定するための PHP スクリプトを作成し、最初にサブドメインを設定し、次にルート ドメインを設定します。
コードをコピー | |
setcookie("バー", "www", time() + 10, "/", "www.bKjia.c0m");
setcookie("bar", "foo", time() + 10, "/", ".bKjia.c0m"); ?> |
コードをコピー | |
最初に設定してから参照すると、サブドメインの Cookie が有効であることが結果で確認できます。
ブラウザウィンドウを再度開き、WebDeveloper を使用して Cookie を削除するか、結果への影響を避けるために手動で削除します。
次に、setcookie を 2 回呼び出す順序を変更します。つまり、最初にルート ドメインを設定し、次にサブドメインを設定します。
コードは次のとおりです
?>
|
テスト プロセスを 2 回繰り返し、Firebug を使用してリクエスト ヘッダーの違いを記録します。
初めての場合は、最初にサブドメインを設定し、次にルート ドメインを設定します。リクエスト ヘッダー Cookie の値は bar=www;bar=foo で、有効な結果は bar=www です
2 回目は、最初にルート ドメインを設定し、次にサブドメインを設定します。リクエスト ヘッダー Cookie の値は bar=foo;bar=www で、有効な結果は bar=fooです。
言い換えると、サーバーサイド PHP の場合、同じ名前の Cookie については、リクエスト ヘッダー Cookie の中で最初にある Cookie が有効になり、後の Cookie は無視されます。
Firefox を使用していない場合は、現時点では、PHP コードを使用して Cookie ヘッダーを検出できます。
コードは次のとおりです
コードをコピー
if (isset($_SERVER['HTTP_COOKIE'])) var_dump($_SERVER['HTTP_COOKIE']); | |
上記の実験結果は Firefox に基づいています。ブラウザによって Cookie の送信方法が異なる場合があるため、他のブラウザでは結果が異なる場合があります。たとえば、Safari ではサブドメインが常に有効ですが、Opera、Chrome などの他のブラウザでは結果が異なる場合があります。 、などは慎重にテストされていません。このわかりにくい結論を考慮すると、サブドメインとルート ドメインで同じ名前の Cookie を使用しないほうがよいでしょう。 結論: 現在、ルートドメインとサブドメインで同じ名前の Cookie を使用することは非常に賢明ではありません |