ホームページ > バックエンド開発 > PHPチュートリアル > PHP_PHP チュートリアルの異なるサブドメインに同じ名前の Cookie がある問題の解決策

PHP_PHP チュートリアルの異なるサブドメインに同じ名前の Cookie がある問題の解決策

WBOY
リリース: 2016-07-13 10:43:03
オリジナル
1424 人が閲覧しました

$_COOKIEはphpではとても便利なものですが、同じドメイン名の下に異なるサブドメイン名が存在する場合があり、Cookieが1つしか保持されないという問題が発生することがありますのでご紹介します。

PHP のスーパーグローバル変数 $_COOKIE は非常に便利ですが、場合によっては混乱を引き起こす可能性もあります。たとえば、ルート ドメインとサブドメインに同じ名前の Cookie があり、$_COOKIE に保存できるのはどれか 1 つだけです。

RFC では、精度が最も高く、最も長いものを使用することを推奨していますが、ブラウザーによって処理方法が異なります。 Chrome のみをテストしました。このように、PHP はルート ドメインとサブドメインにある同じ名前の Cookie のみを受信し、それ以降の Cookie は無視されます。間違った値を受け取りやすくなります。 Safari は RFC の推奨事項に従っており、個人的にはテストされておらず、他のブラウザでもテストされていないと言われています。


まず、SwitchHosts: www.bKjia.c0m を通じて仮想ドメイン名を設定し、Web サーバーを設定します。もちろん、Hosts ファイルを手動で設定することもできます。さらにいくつかのツールを紹介します。

次に、Cookie を設定するための PHP スクリプトを作成し、最初にサブドメインを設定し、次にルート ドメインを設定します。

コードは次のとおりですコードをコピーCookieを参照するためのスクリプトを作成します:
setcookie("バー", "www", time() + 10, "/", "www.bKjia.c0m"); setcookie("bar", "foo", time() + 10, "/", ".bKjia.c0m");
?>

コードは次のとおりです var_dump($_COOKIE);

?>

ところで: 私が最初にスクリプトを書いたとき、実際には setcookie の前に var_dump を使用しました。これは、リクエスト ヘッダーを送信する前に出力があることを意味します。このような初歩的な間違いを犯すのは本当に罪ですが、さらに驚くべきことは、スクリプトです。長い間チェックした結果、php.ini のデフォルトの Output_buffering = 4096 であることが判明しました。
コードをコピー

最初に設定してから参照すると、サブドメインの Cookie が有効であることが結果で確認できます。

ブラウザウィンドウを再度開き、WebDeveloper を使用して Cookie を削除するか、結果への影響を避けるために手動で削除します。

次に、setcookie を 2 回呼び出す順序を変更します。つまり、最初にルート ドメインを設定し、次にサブドメインを設定します。

コードは次のとおりですコードをコピー setcookie("bar", "foo", time() + 10, "/", ".bKjia.c0m"); setcookie("bar", "www", time() + 10, "/", "www.bKjia.c0m");テスト プロセスを 2 回繰り返し、Firebug を使用してリクエスト ヘッダーの違いを記録します。
?>




最初に設定してから参照すると、ルート ドメインの Cookie が有効であることが結果で確認できます。

初めての場合は、最初にサブドメインを設定し、次にルート ドメインを設定します。リクエスト ヘッダー 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 を使用することは非常に賢明ではありません

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/633196.html技術記事 $_COOKIE は php では非常に便利なものですが、同じドメイン名の下に異なるサブドメインが存在する場合があり、Cookie が 1 つだけ保持されるという問題が発生します...
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート