2012-06-06 111 views
0

我有一個網站。人們可以登錄它放在這裏

sub.domain.com 

如果他們在此登陸,該會議將完成其工作,並用戶將在sub.domain.com登錄。在任何一個頁面,會話值將返回所以它會工作正常。

但也可以通過www.sub.domain.com聯繫站點。當用戶在sub.domain.com上登錄時,會話值在www.sub.domain.com上爲空。 我的意思是,如果用戶登錄sub.domain.com, 當他導航到www.sub.domain.com時,網站會說'請登錄',但用戶已經在沒有'www'的網站上登錄。 希望這一切都清楚,謝謝。

+0

好湯姆·沃爾特斯對不起,我做到了。 – sarkolata

回答

3

在session_start之前的頂部添加主要腳本

ini_set('session.cookie_domain', '.domain.com'); 

如果你運行PHP用了Suhosin啓用,嘗試禁用有設置過

ini_set("suhosin.session.cryptdocroot", "Off"); 
    ini_set("suhosin.cookie.cryptdocroot", "Off"); 

來源PHP bug tracker

由於@RandomDave

你可以動態地從確定域$ _SERVER ['HTTP_HOST'],所以你不必硬編碼域名

ini_set('session.cookie_domain', strtolower(substr($_SERVER['HTTP_HOST'], 0, 4)) == 'www.' ? substr($_SERVER['HTTP_HOST'], 3) : '.'.$_SERVER['HTTP_HOST']); 
+1

+1這是最好的方式,無論出於什麼原因,我發現'ini_set()'比'session_set_cookie_params()'更好。你在回答中沒有提到的兩個要點:*必須在* session_start()之前調用*,並且你可以從$ _SERVER ['HTTP_HOST']動態確定域,所以你不需要必須對域名進行硬編碼,比如'ini_set('session.cookie_domain',strtolower(substr($ _ SERVER ['HTTP_HOST'],0,4))=='www。'?substr($ _ SERVER ['HTTP_HOST'],3):'。'。$ _ SERVER ['HTTP_HOST']);' – DaveRandom

+0

這解決了我的問題,謝謝大家。 – sarkolata

0

設置會話的cookie_domain。

ini_set('session.cookie_domain', '.domain.com'); 

或在您的php.ini中更改此設置。

0

如果您通過www.瀏覽Cookie,會話將使用cookie來存儲會話標識符,該cookie將設置爲Cookie。

您可以通過設置以點爲前綴的會話cookie域來緩解此問題,該點通過使用.domain.com實際上作爲*.domain.com的通配符。你session_set_cookie_params做到這一點,像這樣:

session_set_cookie_params(0, '/', '.domain.com'); 

一個更安全的例子將使用session_get_cookie_params和再傳給其他值回更妙的是,你可以修改服務器上的php.ini設置session.cookie_domain值爲.domain.com(。你也可以使用ini_set)。

0

你也可以在你的站點的根目錄添加.htaccess

RewriteEngine on 
RewriteBase/
RewriteCond %{HTTP_HOST} ^sub\.domain\.com 
RewriteRule ^(.*)$ http://www.sub.domain.com$1 [R=permanent,L]