2011-01-08 73 views
1

我試圖設置它,所以如果你登錄到我的網站會話繼續到我的網站的所有子域。例如,如果您轉到domain.com並登錄,然後轉到sub.domain.com,您將已在sub.domain.com上登錄。根據我的理解,您希望使用ini_set('session.cookie_domain','。domain.com')然後session_start(),然後設置您的會話變量,但這不起作用。PHP多域會話; ini_set不工作?

例子我在做什麼:

代碼爲domain.com:

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

代碼sub.domain.com:

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

但$ _SESSION ['變量']沒有設置。

我也試過在sub.domain.com代碼中使用ini_set(),但它沒有區別。我已經通過使用ini_get()驗證了設置session.cookie_domain的工作。

我在做什麼錯?謝謝!

+0

ini_set與共享主機無關緊要..(因爲在其通常不會禁用..) – CarpeNoctumDC 2011-01-08 01:46:13

回答

4

首先確認中ini_set

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

echo ini_get('session.cookie_domain'); 

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

?> 

更新:

就想過這個問題..你也試試:

<?php 

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

?> 

更新2:備用處理(手動cookie處理)

<?php 

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

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

,並在子域文件

<?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(); 
?> 

三人行,你可以添加到每個文件,隨手關/手柄會話信息

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'); 

你傳遞什麼信息通過會議?還是你用它來處理登錄等?

+0

感謝您的建議,但它會檢查出來。它返回的是我設置的,所以我猜ini_set()在我的主機上沒有被禁用。 – SumWon 2011-01-08 02:03:52

+0

是的,我也嘗試session_set_cookie_params,但它也沒有工作:/。我也嘗試通過.htaccess和使用php_value來設置它。 – SumWon 2011-01-08 02:06:47

0

那麼,如果所有其他的都失敗了,你可以實現你自己的會話 - 所有$_SESSION在PHP中都是一個cookie set/get和一個文件支持數據存儲的包裝。如果你用一個標識符手動存儲一個cookie,然後將數據與該標識符關聯起來(比如在一個數據庫中,甚至是),你可以獲得基本相同的功能(serialize()可能會幫助你存儲一堆不同的會話數據)。

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; 
} 

這樣,沒有人可以在cookie中讀取的會話。因爲你不必是一個在你的瀏覽器中插入cookie的天才。有了這個,人們往往會忘記會話實際上可以從服務器讀取。如果您的瀏覽器可以訪問它,其他程序也可以。