2008-12-07 39 views
26

我正在一個網站上有多個子域,其中一些應該有自己的會話。PHP:Cookie域/子域控制

我想我已經搞清楚了,但已經注意到了一些我不明白的cookie處理方法。我沒有看到解釋它的文檔中的任何內容,所以我想我會看看是否有人在這裏提供了一些解決問題的方法。

如果我只是做:

session_start(); 

我結束了一個會話cookie這樣的:

subdomain.example.net

但是,如果我做任何嘗試設置cookie域名我自己,或者像

ini_set('session.cookie_domain', 'subdomain.example.net'); 

或類似

session_set_cookie_params(0, "/", "subdomain.example.net", false, false); 

我最終爲.subdomain.example.net(注意開頭點),我相信意思是「匹配所有子域(或在這種情況下子子域)的Cookie。

這似乎發生在我所有的cookie中,而不僅僅是會話。如果我自己設置Cookie域,它會自動添加點,意味着此域及其所有子域。如果我沒有設置域名,那麼只需使用當前域名即可。

任何想法是什麼導致這一點,我能做些什麼來控制這個前置點?

謝謝!

+0

根據每個現代瀏覽器實現的RFC 6265,您不必控制前導點,因爲它只是被瀏覽器忽略*。所以,不要考慮這個主要的點。除此之外,請明確設置cookie域,或將其設置爲空字符串以將其限制爲當前請求主機。圖書館https://github.com/delight-im/PHP-Cookie有一些方便的控制。 – caw 2016-07-13 00:05:28

回答

24

PHP的cookie功能會自動在$域前綴一個點。如果你不想要這種行爲,你可以使用header函數。例如:

header("Set-Cookie: cookiename=cookievalue; expires=Tue, 06-Jan-2009 23:39:49 GMT; path=/; domain=subdomain.example.net"); 
+12

如果您閱讀了RFC 6265的全部內容,您將會意識到擁有「僅限主機」Cookie的唯一正確方法是不設置域屬性。 http://tools.ietf.org/html/rfc6265#section-5.4 – stolsvik 2011-11-14 13:13:56

+1

「擁有」僅限主機「cookie的唯一正確方法是不設置域屬性」 不是PHP特有的,但是這個幫助我解決了一個問題,當我們從僅限HOST的cookie切換到x-subdomain cookie時,我試圖通過指定完整的域名來刪除javascript中的主機cookie,並且JavaScript預先添加了一個導致現有cookie的域的點不匹配,因此不會被刪除。 – 2014-06-30 18:32:48

16

如果 「http://subdomain.example.net」 下運行PHP腳本,不使用域參數

setcookie('cookiename','cookievalue',time()+(3600*24),'/'); 

你會得到一個cookie與「subdomain.example.net 「(而不是」.subdomain.example.net「)

+0

設置爲subdomain.example.net的顯式域名與未設置的域名有什麼區別? – Pacerier 2013-06-07 00:54:39

+0

如果你設置它,你會在前面得到一個匹配所有子域名的點,而不是隻匹配當前子域名。 – troseman 2013-07-26 20:48:59

2

這可能有助於某人(我花了幾個小時來弄清楚)。在對源文件進行更改並對其進行測試之前,關閉瀏覽器以正確銷燬所有域和子域中的PHPSESSIONID。

希望能節省一些時間!

7

我意識到這是一個老問題,但我是有這個問題,並沒有回答上述相當做到了的。

我想爲子域設置會話cookie,但也啓用httponly和安全。

避免領先。子域的前面,Kevin和stolsvik是正確的,不要設置域屬性。

session_set_cookie_params(0, '/', NULL, TRUE, TRUE); 

現在,您將有一個會話cookie,特定子域(無前導:

因此,要做到這一點,還能夠設置的HttpOnly和安全模式,如下域設置爲NULL )將httponly和secure設置爲true。