web-dev-qa-db-ja.com

PHP:Cookieドメイン/サブドメインコントロール

私は複数のサブドメインを持つサイトで作業しており、そのうちのいくつかは独自のセッションを取得する必要があります。

私はそれがうまくいったと思いますが、私が理解していないCookie処理について何かに気づきました。それを説明するドキュメントには何も見当たらないので、質問を投げかける光がここにいる人がいるかどうかを確認すると思います。

私がやった場合:

session_start();

私は次のようなセッションCookieを取得します。

subdomain.example.net

ただし、Cookieドメインを自分で設定しようとすると、次のようになります。

ini_set('session.cookie_domain', 'subdomain.example.net');

またはのように

session_set_cookie_params( 0, "/", "subdomain.example.net", false, false);

私は.subdomain.example.net(開始ドットに注意)のCookieを生成します。これは、「すべてのサブドメイン(この場合はサブサブドメイン)に一致する」という意味だと思います。

これは、セッションだけでなく、実際に私のすべてのCookieで発生するようです。自分でcookieドメインを設定すると、自動的にドットが付加されます。つまり、このドメインとそのすべてのサブドメインです。ドメインを設定しない場合、現在のドメインのみを使用することでドメインが正しく設定されます。

何がこれを引き起こしているのか、そしてその前に付いているドットを制御するために私ができることは何ですか?

ありがとう!

30
Eli

PHPのcookie関数は、自動的に$ domainの前にドットを付けます。この動作を望まない場合は、 header 関数を使用できます。例えば:

header("Set-Cookie: cookiename=cookievalue; expires=Tue, 06-Jan-2009 23:39:49 GMT; path=/; domain=subdomain.example.net");
24
Brian Fisher

PHPスクリプトを " http://subdomain.example.net "の下で実行する場合、ドメインを使用しないでくださいパラメータ

setcookie('cookiename','cookievalue',time()+(3600*24),'/');

「subdomain.example.net」ではなく(「.subdomain.example.net」ではない)Cookieを取得します

17
Kevin Campion

RFC 6265をすべて読んだ場合、「ホストのみ」のCookieを作成する適切な方法は、ドメイン属性を設定しないことのみであることがわかります。

http://tools.ietf.org/html/rfc6265#section-5.4

12
stolsvik

これは古い質問であることに気づきましたが、私はこの問題を抱えていて、上記の回答のどれもそれを完全に行いませんでした。

サブドメインにセッションCookieを設定したいのですが、httponlyとセキュリティも有効にしたいと思いました。

先行を避けるために。サブドメインの前で、Kevinとstolsvikは正しいですが、ドメイン属性を設定しないでください。

したがって、これを行い、httponlyおよびセキュアモードを設定できるようにするには、次のようにドメインをNULLに設定します。

session_set_cookie_params(0, '/', NULL, TRUE, TRUE);

これで、httponlyとsecureがtrueに設定された特定のサブドメイン(先頭に。がない)のセッションCookieが作成されます。

9
Alex

これは誰かを助けるかもしれません(私はこれを理解するために数時間を費やしました)。ソースファイルに変更を加えた後、テストする前に、ブラウザを閉じて、すべてのドメインとサブドメインのPHPSESSIONIDを適切に破棄します。

これで少し時間を節約できますように!

2
Luciano Camilo

wordpress=にcookieを設定する際に問題がありました。これは私に役立ちました。ドメインの値がすべてのページで機能するための鍵でした

$domain = ($_SERVER['HTTP_Host'] != 'localhost') ? $_SERVER['HTTP_Host'] : false;

setcookie("cookie_name", 'cookie_value', 0, '/', $domain);
0
Gendrith