web-dev-qa-db-ja.com

PHPセッションがサブドメインに引き継ぐことを許可する

すべてのユーザーデータにphpセッション(cookieではなく、セッションID cookieを除く)を使用します。ユーザーが自分のプロファイルuser.mydomain.comにアクセスすると、サブドメインを削除するまですぐに「ログアウト」されます。

* .mydomain.comであれば、すべてのドメインからセッションを受け入れる方法はありますか

68
Anthony

4つのオプションがあります。

これをphp.iniに配置します。

session.cookie_domain = ".example.com"

または、.htaccessで:

php_value session.cookie_domain .example.com

または、スクリプトの最初のものとして:

ini_set('session.cookie_domain', '.example.com' );

または、サイトのphp-fpmプール構成で:

php_value[session.cookie_domain] = .example.com
83
CTT
        if(isset($_COOKIE['session_id']))
            session_id($_COOKIE['session_id']);
        Zend_Session::start(); //or session_start();
        if(!isset($_COOKIE['session_id']))
            setcookie('session_id', session_id(), 0, '/', '.yourdomain.com');

あなたが私と同じくらい不完全または悪い答えに不満を感じているなら、これはあなたの救い主です。それはただ動作します。

12
sucitivel

コア関数ファイルの上部にあるセッション名を次のように変更します

 session_name('mysession');

次に、PHPページに次のコードを使用します

  session_set_cookie_params(0,"/",".example.com",FALSE,FALSE);
  setcookie(session_name(), session_id(),0,"/","example.com");
  session_start();

最後に、サブドメインのデフォルトのセッション名を変更し、次のようなサブドメインのコア機能ファイルからデフォルトのCookieを削除します。

 /*default session name*/
 session_name("mysession");
 /*remove the PHPSESSID and default session name from subdomain's cookie*/
 setcookie( "mysession", "",1,"/" );
 setcookie( "PHPSESSID", "",1,"/" );

クッキー名をPHPSESSIDとして使用し続ける場合は、次のコマンドですべての関数を削除してください。

 "mysession" string like session_name('mysession'), setcookie( "mysession", "",1,"/" );

次に、ブラウザの既存のCookieを確認し、ドメインとサブドメインのすべてのCookieを削除して、プロセスを繰り返します。

5

私はこれがかなり古いことを知っていますが、@ CTTの提案をさらに拡張するために、次のテキストを使用してサブドメインの各サブディレクトリ(phpコードを実行し、セッションを必要とします)にphp.iniファイルを追加する必要がありました:

suhosin.session.cryptdocroot=Off
suhosin.cookie.cryptdocroot=Off

これが役立つことを願っています(これを理解するのに何年もかかりました)。

4
joeldixon66

はい。 ini_set は働いている。ただし、ブラウザのすべてのキャッシュとCookieを破棄して、機能することを確認してください。

  1. ブラウザのすべてのキャッシュとクッキーを破壊する
  2. あなたのxxx.example.comおよびyyy.example.com、phpファイルは次のように開始する必要があります。

    ini_set('session.cookie_domain', '.example.com' ); session_start();
    
3
Wikum Ekanayake

私のために働いた別のオプション:セッションの名前を強制することです:

session_name("myWebsite");
session_start(); 
3

この問題が発生したばかりで、2つの異なるサブドメインに異なるphp.iniファイルを使用していたことがわかりました。これらのiniファイルは、異なる session.save_path 変数を指定しました。明らかな理由から、これはセッションを共有する必要があるすべてのサブドメインで同じである必要があります。

0
Mike

これを試して:

session_start(); 

$sessionId =  session_id();

ユーザーを記録しました。ユーザーが他のサブドメインに切り替えると、このようなuser.mydomain.com/?id=$sessionId

$sessionId =  $_GET['id'];

session_start($sessionId); 

これで、ユーザーはすべてのセッション値を取得し、ログインしたままになります。

0
abrar