2012-02-05 147 views
9

我有一個網站www.example.com。這將有多個子域用於單個應用程序或程序。例如,login.example.com將允許用戶登錄網站,而system.example.com將允許用戶訪問信息系統,而forums.example.com則允許用戶訪問論壇。在多個子域之間共享SESSION變量

我們可能需要在子域之間傳遞信息,例如用戶ID或用戶偏好等。我們如何使用SESSION變量在sudomains之間傳遞信息?

編輯: 我喜歡這個主意:

由於在腳本的第一件事:

ini_set('session.cookie_domain', '.example.com'); 
+1

可能重複? [允許php會話繼承到子域](http://stackoverflow.com/questions/644920/allow-php-sessions-to-carry-over-to-subdomains) – Josh 2012-02-05 22:38:38

+2

你打算在所有的會話中使用SAME會話嗎?的子域名,或者你希望會話信息被子域隔離?如果您曾經擴展並將一個子域移動到另一個物理服務器,那麼如果您跨所有域共享會話,則這可能會產生問題。或者你必須切換到所有服務器都可以訪問的基於內存/數據庫的會話存儲。 – drew010 2012-02-05 22:43:16

+0

我打算在所有子域上使用SAME會話。然而另一個缺點可能是我在一個服務器上有多個域。然後我會怎麼做才能將會話保持在常規域名之間,但是隻保留子域名? – 2012-02-06 16:52:24

回答

13

PHP會話ID保存的Cookie。 要在所有子域中創建Cookie,您需要將其分配到根域。然後,所有的子域都會從cookie獲取會話ID,PHP可以使用傳遞的會話ID來查找會話。

事實證明,你只需要在session.cookie_domain設置爲根域php.ini文件

session.cookie_domain = ".example.com" 

同時檢查manual爲用於設置INI項不同的方法。

+0

如果您在擁有多個域的情況下使用託管服務,該怎麼辦?例如example1.com,example2.com,example3.com。那你會怎麼做? – 2012-02-06 16:48:37

+1

在'.htaccess'文件中爲您的每個域名添加'php_value session.cookie_domain .example.com' – 2012-02-06 17:12:19

+1

對不起,您應該添加「php_value session.cookie_domain .example.com?」正確? – 2012-02-06 17:58:12

9

1)子域應該使用相同的路徑保存會話文件

2)修改

的php.ini session.cookie_domain = ".example.com"

或的.htaccess php_value session.cookie_domain .example.com

或腳本的內部ini_set('session.cookie_domain', '.example.com');

+0

如果您在擁有多個域名的情況下使用託管服務,該怎麼辦?例如example1.com,example2.com,example3.com。那你會怎麼做? – 2012-02-06 16:49:17

+0

@KevinOluseunKarimu沒有什麼餅乾,它不這樣工作。您可以將會話ID附加到通往另一個域的鏈接,在另一個域中獲得此會話ID並開始會話。有關共享會話文件夾的要求仍然存在。 – Cheery 2012-02-06 16:56:01

+0

我如何獲得sessiom id放入鏈接? – 2012-02-06 17:02:30

2

您可以使用cookie。請檢查setcookie()中的path參數,該參數使該cookie可用於整個域。缺點這個人誰關閉cookies(私人瀏覽模式)

另一種方法是通過passing the sessionID around using links或隱藏<input>字段(表單)。

因爲單獨的網站不會共享會話(據我所知,因爲子域在技術上來自於彼此的「不同地方」),所以不要使用會話來存儲在服務器端。相反,使用數據庫來處理你的會話。這樣,多個站點可以共享同一個會話跟蹤表。

+0

如果您在擁有多個域的情況下使用託管服務,該怎麼辦?例如example1.com,example2.com,example3.com。那你會怎麼做? – 2012-02-06 16:50:32

7

我找到了解決我的問題:

session_name("2620368ghwahw90w"); 
session_set_cookie_params(0, '/', '.mydomain.com'); 
session_start(); 

這似乎沒有問題的工作。這是一個安全風險低的好方法嗎?

3

,再創建你的PHP文件會議,在第一行中加入這一行:

<?php 
//session cross to sub domain 
ini_set('session.cookie_domain', substr($_SERVER['SERVER_NAME'],strpos($_SERVER['SERVER_NAME'],"."),100)); 
0

我一直在現在這個兜兜了一段時間,什麼工作對我來說是把下面的代碼:

session_name("some_session_name"); session_set_cookie_params(0, '/', '.some_domain.com'); session_start();

跨所有將使用會話變量的子域。我在我的索引php文件的開始處設置了它,它起作用。希望這會說清楚。