2011-01-08 19 views
1

私はそれをセットアップしようとしています。私のウェブサイトにログインすると、セッションは私のウェブサイトのすべてのサブドメインに引き継がれます。たとえば、domain.comにアクセスしてログインしてからsub.domain.comにアクセスすると、すでにsub.domain.comにログインしています。PHPマルチドメインセッション。 ini_setが動作しませんか?

私の理解では、ini_set( 'session.cookie_domain'、 '.domain.com')とsession_start()を使い、セッション変数を設定したいが、これは動作しません。

コードをdomain.comのため:私がやっているの

例sub.domain.comため

<?php 
ini_set('session.cookie_domain','.domain.com'); 
session_start(); 
$_SESSION['variable'] = 1; 
?> 

コード:

<?php 
session_start(); 
echo $_SESSION['variable']; 
?> 

しかし、$ _SESSION [ '変数']は設定されていません。

また、sub.domain.comコードでini_set()を使用してみましたが、違いはありませんでした。 ini_get()を使用してsession.cookie_domainの設定が機能していることを確認しました。

私は間違っていますか?ありがとう!

+0

ini_setは本当に共有ホストでは問題ありません。(普通は無効ではありません..) – CarpeNoctumDC

答えて

4

まずini_set

<?php 
ini_set('session.cookie_domain','.domain.com'); 

echo ini_get('session.cookie_domain'); 

session_start(); 
$_SESSION['variable'] = 1; 

?> 

更新

を確認(手動クッキー処理)

<?php 

session_start(); 
session_regenerate_id(); 
$_SESSION['variable'] = "String Test"; 

setcookie('PHPSESSID',session_id(),time()+86400,'/','.domain.com'); 
echo session_id(); 
?> 

とサブドメインファイル中のあなたはを通して何の情報を渡している

if (isset($_COOKIE['PHPSESSID']) && !empty($_COOKIE['PHPSESSID'])) session_id($_COOKIE['PHPSESSID']); 
session_start(); 
if (!isset($_COOKIE['PHPSESSID'])) setcookie('PHPSESSID',session_id(),time()+86400,'/','.domain.com'); 

/ハンドルセッション情報をハンドオフするすべてのファイルに追加することができ

<?php 
if (isset($_COOKIE['PHPSESSID']) && !empty($_COOKIE['PHPSESSID'])) session_id($_COOKIE['PHPSESSID']); 

session_start(); 
echo $_SESSION['variable'] . "<br />"; 
echo $_COOKIE['PHPSESSID'] . "<br />"; 
echo session_id(); 
?> 

3本の線セッション?それとも、ログインなどの処理に使用していますか?

+0

提案していただきありがとうございます。それは私が設定したものを正確に返すので、ini_set()はホスト上で無効になっていないと思います。 – SumWon

+0

はい、私もsession_set_cookie_paramsを試しましたが、動作しませんでした:/。また、.htaccessとphp_valueを使って設定しようとしました。 – SumWon

+0

他のすべてが失敗した場合は、手動で情報を手作業で処理してください(アップデート2を参照) – CarpeNoctumDC

0

他のすべてが失敗した場合は、独自のセッションを実装できます。$_SESSIONはすべて、Cookieセット/ getとファイルバックアップデータストアのラッパーです。 IDとともに手動でクッキーを保存し、そのIDとデータを関連付けると(たとえば、DB内でも)、基本的に同じ機能を得ることができます(さまざまなセッションデータを格納する場合はserialize()が役に立ちます)。

ちょうどそれについて考えたが..あなたも試してくださいました:

<?php 

session_set_cookie_params(0, "/", ".domain.com", false, false); 
session_start(); 
$_SESSION['variable'] = 1; 

?> 

アップデート2:代替処理

0

私はそれが質問の後半であることを知っていますが、これが私が見つけた唯一の適切な答えであり、答えが投票されてから人々がそれを使用しようとしているのを見て、私はそれが起こるのを待っているセッションのハックです。だから、このためのソリューション:

define("ENCRYPTION_KEY", "whatever you want to use as key"); // encryption key 
if (isset($_COOKIE['SessionEncrypt']) && !empty($_COOKIE['SessionEncrypt'])) { 
    //echo "get cookie: ".$_COOKIE['SessionEncrypt']; //urldecode(decrypt($_COOKIE['SessionEncrypt'], ENCRYPTION_KEY)); 
    session_id(decrypt(urldecode($_COOKIE['SessionEncrypt']), ENCRYPTION_KEY)); 
    //session_id($_COOKIE['SessionEncrypt']); 
} 
session_start(); 
setcookie('SessionEncrypt',urlencode(encrypt(session_id(), ENCRYPTION_KEY)),time()+86400,'/','yourdomain.com'); // will work cross subdomain 

は、暗号化/復号化するには、(どこかにここでそれを見つけ、魔法のように動作します):

function encrypt($pure_string, $encryption_key) { 
    $iv_size = mcrypt_get_iv_size(MCRYPT_BLOWFISH, MCRYPT_MODE_ECB); 
    $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND); 
    $encrypted_string = mcrypt_encrypt(MCRYPT_BLOWFISH, $encryption_key, utf8_encode($pure_string), MCRYPT_MODE_ECB, $iv); 
    return $encrypted_string; 
} 

function decrypt($encrypted_string, $encryption_key) { 
    $iv_size = mcrypt_get_iv_size(MCRYPT_BLOWFISH, MCRYPT_MODE_ECB); 
    $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND); 
    $decrypted_string = mcrypt_decrypt(MCRYPT_BLOWFISH, $encryption_key, $encrypted_string, MCRYPT_MODE_ECB, $iv); 
    return $decrypted_string; 
} 

この方法では誰もがクッキーにセッションを読み込むことはできません。あなたのブラウザにクッキーを挿入するための天才である必要はありません。これにより、人々はセッションが実際にサーバーから読めることを忘れる傾向があります。あなたのブラウザがそれにアクセスできる場合、他のプログラムも可能です。

+0

違いは何ですか?誰かが自分のマシンに同じCookieを置くことができれば、暗号化されていても問題ありません。それとも私は何かが足りない? :) –

関連する問題