2012-02-16 122 views
5

我一直在試圖維護兩個子域之間的會話變量,並發現它不可能。我結束了創建2個最小的PHP網頁作爲測試牀,一個我稱之爲「測試1」只是設置跨子域維護會話變量

$_SESSION['test'] = "Fred"; 

,並具有超鏈接「測試2」,這只是嘗試呼應$ _SESSION [價值'測試']來證明它的工作,或不。我將'測試1'放在我的www域中,'測試2'放在我的子域中。我嘗試了各種來源的頭文件中的各種版本。以下是主要的3(當然它們的變體):

ini_set('session.cookie_domain',substr($_SERVER['SERVER_NAME'],strpos($_SERVER['SERVER_NAME'],"."),100)); 
session_start(); 

ini_set('session.cookie_domain','mydomain.com'); 
session_start(); 

ini_set('session.cookie_domain', PHP_INI_ALL); 
session_start(); 

session_set_cookie_params(0, "/", ".mydomain.com", false); 
session_start(); 

我發現我得到一個每種情況下的結果都一樣。會話不是通過子域進行的,頁面測試2不知道我將$ _SESSION ['test']設置爲什麼值。然而,上述方法之一應該起作用的'網絡似乎有很多確定性。任何想法可能會發生什麼,特別是因爲我使用最小的頁面來測試機制(沒有副作用,我可以看到)?順便說一下,我在共享服務器上,如果這是pertinant在這裏。

謝謝你的想法。坦率。

編輯我修好了。問題是由Suhosin造成的。查看本頁腳下的詳細解答。

回答

5

好吧我釘它,這是一個臭氣熏天。

Suhosin的suhosin.session.cryptdocroot選項是問題的全部原因。當會話加密密鑰基於DocRoot時,會導致子域在從不同目錄提供基本域和子域時看不到對方的會話變量。這導致服務器上的會話變量存儲在不同的文件夾中,因此它們對每個相應的域都不可見。

解決方案。只需在php.ini文件中添加這兩行:

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

48小時惡夢追蹤,4.8秒修復。

+0

「一個48小時的惡夢追查,4.8秒修復」 - 超級。我理解你 :) – qasanov 2012-12-26 09:40:56

0

我有工作,設置會話名和會話cookie參數:

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

謝謝。我嘗試命名會話 - 沒有喜悅。我現在確實有更多的信息。我嘗試了php.net文檔中建議的測試,並添加了以下內容:$ some_name = session_name(「some_name」); $ blnResult = ini_set(「session.cookie_domain」,「.mydomain.com」);在session_start(); if(empty($ blnResult)or(!$ blnResult)){echo「設置無法設置」;出口; }我發現返回結果表明它沒有被設置!任何想法爲什麼這應該是? – Frankie 2012-02-16 19:29:27

+0

@Frank Anderson我沒有嘗試'ini_set'方法,只是'session_set_cookie_params'之一。 – jeroen 2012-02-16 23:02:05

+0

謝謝jeroen。我看到一個笨拙的錯誤,但現在我糾正了這一點,是的,我現在使用的設置完全按照您在這裏所建議的。仍然會話變量的值不會轉移到「接收」頁面,只要它位於子域中即可。還有什麼可以做的,或者我可以嘗試其他什麼診斷方法來試圖弄清楚發生了什麼? – Frankie 2012-02-17 00:21:46