94

私は以下を設定しようとしています:

auth.example.com
sub1.example.com
sub2.example.com

sub1.example.comユーザーがアクセスした場合、またはログインしていない場合、ユーザーはsub2.example.comにリダイレクトされ、ログインauth.example.comできます。

sub1.example.comおよびsub2.example.comは2つの別個のアプリケーションですが、同じ資格情報を使用します。

php.iniで次のように設定してみました。

session.cookie_domain = ".example.com"

しかし、あるドメインから別のドメインに情報を渡しているようには見えません。

[編集]

私は次のことを試しました:

sub1.example.com/test.php

session_set_cookie_params(0, '/', '.example.com');
session_start();
print session_id() . "<br>";
$_SESSION['Regsitered'] = 1;
echo '<a href="http://auth.example.com/test.php">Change Sites</a>'

auth.example.com/test.php

session_set_cookie_params(0, '/', '.example.com');
session_start();
print session_id() . "<br>";
$_SESSION['Checked'] = 1;
print_r($_SESSION);

セッションIDはまったく同じですが、$_SESSION変数をダンプすると、両方のキーが表示されず、各ドメインで設定したキーだけが表示されます。

4

17 に答える 17

139

問題がまだ存在するかどうかはわかりませんが、同じ問題に遭遇し、呼び出す前にセッション名を設定して解決しましたsession_set_cookie_params():

$some_name = session_name("some_name");
session_set_cookie_params(0, '/', '.example.com');
session_start();

私は何も変更していませんがphp.ini、今ではすべて正常に機能しています。

于 2009-09-22T00:35:37.877 に答える
24

Cookie が正しく設定されているにもかかわらず、サブドメインでセッション データが読み取られないようにする不思議なことの 1 つ.example.comは、PHP Suhosin パッチです。質問の例に従って、すべてを正しく構成できますが、機能しません。

次の Suhosin セッション設定をオフにすると、ビジネスに戻ります。

suhosin.session.cryptua = Off 
suhosin.session.cryptdocroot = Off
于 2011-06-25T12:49:12.783 に答える
5

使用してみてください:

session.cookie_domain = "example.com"

それ以外の:

session.cookie_domain = ".example.com"

先頭にピリオドがないことに注意してください。

ただし、これはすべてのブラウザーでサポートされているわけではないため、注意して使用してください。

于 2009-06-30T15:17:16.420 に答える
4

この正確な問題がありました-x.example.localで作成されたセッション値をexample.localで使用できるようにしたい、またはその逆が必要でした。

php_value session.cookie_domain .example.local私が見つけたすべてのソリューションは、.htaccessで(またはphp.iniまたはini_setを介して)使用してセッションドメインを変更すると言われています 。

キャッチはsession.cookie_domain、すべてのサブドメイン(これまでのところ問題ありません)だけでなく、メインドメインにも設定していたことです。メイン ドメインに を設定することsession.cookie_domainは明らかに禁止されています。

基本的にそれが私のために働いた方法:

  • session.cookie_domainすべてのサブドメインに設定します。
  • メイン DOMAIN には設定しないでください

そうそう、ドメインに TLD (私の場合は .local) があることを確認してください。HTTP プロトコルでは、Cookie/セッションを .tld なしでドメインに保存することはできません (つまり、localhost は機能しませんが、stuff.localhost は機能します)。

編集: また、サブドメイン間でセッションをテスト/デバッグしている間は、ブラウザーの Cookie を常にクリアするようにしてください。そうしないと、ブラウザーは常に古いセッション cookie を送信しますが、これにはおそらく正しい cookie_domain がまだ設定されていません。サーバーは古いセッションを復活させるため、偽陰性の結果が得られます。(多くの投稿で、まったく同じ効果のために session_name('stuff') を使用することが言及されています)

于 2013-12-03T14:10:00.780 に答える
3

確認しました。ジョレオンの答えは正しいです。私の評判が十分ではないのでコメントできませんので、ここにコメントを投稿します。

構成ファイルで定数を定義します。変更したい場合、ファイル全体を変更する必要はありません。

define('ROOT_DOMAIN',   'mysite.example');
define('PHP_SESSION_NAME', 'MYSITE'); 

セッション名は数字のみで構成することはできません。少なくとも 1 つの文字が存在する必要があります。そうしないと、毎回新しいセッション ID が生成されます。

セッションの使用を開始するには、次のコードを使用します

session_name(PHP_SESSION_NAME);
session_set_cookie_params(0, '/', '.' . ROOT_DOMAIN);
session_start();

私はこの機能を使用しています:

function load_session() {
    if (session_status() == PHP_SESSION_NONE) {
        session_name(PHP_SESSION_NAME);
        session_set_cookie_params(0, '/', '.' . ROOT_DOMAIN);
        session_start();
    } elseif (session_name() != PHP_SESSION_NAME) {
        session_destroy();
        session_name(PHP_SESSION_NAME);
        session_set_cookie_params(0, '/', '.' . ROOT_DOMAIN);
        session_start();
    }
}
load_session(); // put it in anywhere you want to use session
于 2015-05-12T17:56:34.157 に答える
3

私はこのようにそれを解決しました

ini_set('session.cookie_domain', '.testdomain.example');
session_start();

私はローカルホストで作業していたので

ini_set('session.cookie_domain', '.localhost');

.com/.local/... ではなく.localhost がトップレベルとして表示されます (私は疑っています)。

于 2012-04-12T17:27:13.100 に答える
1

これを使用して、それは動作します:

ini_set('session.cookie_domain', 
    substr($_SERVER['SERVER_NAME'],strpos($_SERVER['SERVER_NAME'],"."),100));
于 2010-10-05T20:22:21.163 に答える
0

session_start()メソッドのすぐ上にある次のコードを使用してみてください

$sess_life_time = 21600; //in seconds
$sess_path = "/";
$sess_domain = ".example.com";
$sess_secure = true; // if you have secured session
$sess_httponly = true; // httponly flag

session_set_cookie_params($sess_life_time, $sess_path, $sess_domain, $sess_secure, $sess_httponly);
于 2014-07-09T10:50:18.140 に答える
0

上記のすべての回答を読みました。私の回答は、これをグーグルで検索する人々に役立つと思います。

  • ブラウザがセッション Cookie を (ドメインおよびサブドメインの) サーバーに送り返すことを確認し、セッション Cookie ドメインを として設定します.example.com

  • セッション変数を復元するために、PHP が適切な「ターゲット」を見つけていることを確認します。

    • ドメインとサブドメインが同じマシン(おそらく異なる仮想ホスト)を指している場合session_save_pathは、すべてが同じであることを確認してください(テスト済み)
    • ドメインとサブドメインが異なるマシンを指している場合、共通のストレージ (データベースなど) がセッション データの保存と復元に最適です (まだテストしていません)。そのために使用session_set_save_handlerします。
于 2012-12-21T03:55:28.413 に答える
0

Joel が提案しているように、OpenID のようなものは望まないが、複数のドメインにまたがるセッション データにアクセスしたいという考えが得られます。

その問題の解決策として考えられる唯一の可能性は、セッションデータをデータベースに保存し、そのデータベースから引き出すことです。

于 2009-06-30T15:18:51.953 に答える
0

他のバージョンの PHP について話すことはできませんが、 5.6.6session.cookie_domainでは、ファイルに値を設定するだけでphp.ini、iPage 上のすべてのサブドメインが同じセッション変数のセットを共有できるようになりました。

ドメインに関連する既存の Cookie をブラウザーから削除してテストしてください。

session.cookie_domain = '.yourdomainname.example'

ああ、違いがあるかどうかはわかりませんが、セッションの自動開始も使用しています。

session.auto_start = 1
于 2016-11-03T17:13:52.477 に答える
0

私は同様の問題を抱えていましたが、この解決策は私にとっては良かったです。おそらく将来的に他の人を助けるでしょう

php.ini を編集します

session.cookie_domain = ".example.com"

魔法はここにある

suhosin.session.cryptdocroot = Off

suhosin.cookie.cryptdocroot = Off

https://www.sitepoint.com/community/t/sessions-across-subdomains-domain-com-phpsessid-changes/3013/19

于 2016-07-26T19:06:54.703 に答える
0

これが古いことは知っていますが、同じボックスに複数のドメインとサブドメインがある場合、これはうまく機能します。

<?php
define('site_domain','example.com');
session_set_save_handler('_open',
                         '_close',
                         '_read',
                         '_write',
                         '_destroy',
                         '_clean');

function _open(){

    global $_sess_db;

$db_user = 'user';
$db_pass = 'pass';
$db_host = 'localhost';

if ($_sess_db = mysql_connect($db_host, $db_user, $db_pass)){

    return mysql_select_db('database', $_sess_db);

}

return false;

}

function _close(){

    global $_sess_db;
    return mysql_close($_sess_db);

}

function _read($id){

    global $_sess_db;
    $id = mysql_real_escape_string($id);
    $domain = mysql_real_escape_string(site_domain);
    $agent = mysql_real_escape_string(isset($_SERVER['HTTP_USER_AGENT']));

    $sql = "SELECT data
    FROM sessions
    WHERE id = '$id' AND domain = '$domain' AND agent = '$agent'";

     if ($result = mysql_query($sql, $_sess_db)){

         if (mysql_num_rows($result)){
             $record = mysql_fetch_assoc($result);
             return $record['data'];
        }

    }

    return '';

}

function _write($id, $data){

    global $_sess_db;
    $access = time();

    $id = mysql_real_escape_string($id);
    $access = mysql_real_escape_string($access);
    $data = mysql_real_escape_string($data);
    $domain = mysql_real_escape_string(site_domain);
    $agent = mysql_real_escape_string(isset($_SERVER['HTTP_USER_AGENT']));

    $sql = "REPLACE INTO sessions
    VALUES ('$id', '$access', '$data', '$domain', '$agent')";

    return mysql_query($sql, $_sess_db);

}

function _destroy($id){

    global $_sess_db;
    $id = mysql_real_escape_string($id);
    $domain = mysql_real_escape_string(site_domain);
    $agent = mysql_real_escape_string(isset($_SERVER['HTTP_USER_AGENT']));

    $sql = "DELETE FROM sessions
    WHERE id = '$id' AND domain = '$domain' AND agent = '$agent'";

    return mysql_query($sql, $_sess_db);

}

function _clean($max){

    global $_sess_db;
    $old = time() - $max;
    $old = mysql_real_escape_string($old);
    $domain = mysql_real_escape_string(site_domain);
    $agent = mysql_real_escape_string(isset($_SERVER['HTTP_USER_AGENT']));

    $sql = "DELETE FROM sessions
    WHERE  access < '$old' AND domain = '$domain' AND agent = '$agent'";

    return mysql_query($sql, $_sess_db);

}

?>

于 2012-01-17T16:46:08.277 に答える
-2

手っ取り早い解決策は、これをリダイレクトに使用することです。

header( $url.'?'.session_name().'='.session_id() );

これにより、URL に の行に沿って何かが追加?PHPSESSID=etnm7kbuf5lg0r6tv7je6ehtn4され、使用するセッション ID が PHP に伝えられます。

于 2009-06-30T18:58:54.090 に答える