2012-10-02 35 views
0

我運行一個網站,它可以通過不同的域到達後可供選擇:domainname.de,domainname.ch,domainname.at,domainname.es等...PHP會話有時不能傳遞到另一個域

當我的客戶想要支付我們的付款頁面,當然這是https保護。由於服務器的限制,我只能擁有一個SSL證書,我只能將其放在一個域名中:domainname-secure.com。

因爲我收取不同的價格,我需要知道用戶屬於哪個域,所以當重定向到domainname-secure.com時,我將域(例如domainname.de)保存在會話變量$_SESSION['domain_default']中,並通過添加session_id=[session_id]作爲get參數。

然後我檢查我採取$_GET['session_id']和運行後續命令對domainname-secure.com提供的會話:

session_id($_GET['session_id']); 

session_start(); 

當我測試它自己,它工作完全正常,但我做一個日誌當有人進入domainname-secure.com並且沒有設置$_SESSION['domain_default']時輸入。

這種情況每天發生幾次,但我真的不知道爲什麼這樣做不起作用!我從很多不同的鏈接一次又一次地測試它,但對我來說它工作得很好。

你們有些人可以想象爲什麼它有時不起作用嗎?

將會話ID傳遞到另一個域是不是「好」或不安全,並且在重定向後它不總是可讀的?

我知道你很難確定一個錯誤,但我正在尋找一些有關會話的知識問題,或者是一個提示如何以更好的方式做到這一點?

+0

您的服務器設置是否包含suhosin補丁集? – complex857

+0

爲什麼不直接將域添加到數據庫中的用戶?那麼你不需要這個不必要的複雜設置。 – jeroen

+1

@jeroen他想要獲取他存儲在'$ _SESSION'中的數據。這就是爲什麼他通過get來傳遞session_id。我假設他從原始域以外的'$ _SESSION'變量獲得了一些其他信息。否則,他可以將域名放在'$ _GET'參數中。 –

回答

2

會話由PHP按每個域的管理這意味着它們不會有意混合使用域。

如果您將使用其他會話存儲機制,例如寫入數據庫或使用memcached會話,您將能夠克服此限制。

有兩種方法,如果你想改變域的時候能夠訪問會話信息之一:

  • 不要使用PHP的$ _SESSION,設置自己的會話管理的memcached/Redis的/ SQL;

或者:

  • 使用PHP的$ _SESSION,而是從一個域轉移到另一個序列化時,在$ _SESSION中的數據,並把它從某個地方像SQL兩個域的訪問;
+0

SESSION謝謝你的回答。但是,這不就是爲什麼session_id可以通過get參數來傳遞(除了可以禁用cookie的事實)以解決這個限制嗎? – Freddy

+1

不,這就是爲什麼*即使您通過$ _GET傳遞session_id,您將無法訪問其他域會話文件 - 它們是分開的。 –

+0

但它適用於我..我只收到錯誤消息,它不適用於其他人。這不是瀏覽器相關的,是嗎? – Freddy

相關問題