2009-09-02 190 views
1

我在本地跨兩個「域」工作。我在我的機器上有enterprise.local和application.local虛擬主機,我需要爲「local」或「.local」設置一個域名cookie。但是,在正確設置cookie時遇到了一些麻煩。在application.local,我有這樣的:問題設置Cookie w/PHP

setcookie('iPlanetDirectoryPro', trim($token_id), '0', '/', '.local'); 
header('Location: /adcom-sso'); 

我也試過這樣:

header('Set-Cookie: iPlanetDirectoryPro=' . trim($token_id) . '; path=/'); 
header('Location: /adcom-sso'); 

使用setcookie(),沒有cookie被設定過。使用Set-Cookie標題,Cookie 設置爲。我已經從兩者中刪除了重定向,結果從未改變。它適用於Set-Cookie,但不適用於setcookie()。這將是罰款,因爲我真的沒有我使用的解決方案的偏愛,但在Set-Cookie解決方案,只要我添加域這一切發生故障:當我在加

header('Set-Cookie: iPlanetDirectoryPro=' . trim($token_id) . '; path=/; domain=local'); 

域值,我得到一個頭錯誤:

Header may not contain more than a single header, new line detected. 

我試過域值爲「local」和「.local」。行爲不會改變。

我很少必須明確地訪問cookie,所以我希望我只是錯過了一些明顯的東西,但我一定沒有看到它。任何有識之士將不勝感激。

更新:我想我已經縮小了這一點。似乎只要我不包含域值,兩種方式都可以使用。使用「local」或「.local」作爲cookie的特定域名會出現問題嗎?

回答

2

編輯: 我現在已經在RFC2109一看,4.3.2拒絕餅乾:

  • The value for the Domain attribute contains no embedded dots or does not start with a dot.

    ...

  • A Set-Cookie with Domain=.com or Domain=.com., will always be rejected, because there is no embedded dot.

看來,瀏覽器被拒絕「本地」出於安全考慮。要爲域設置Cookie,它必須至少有兩個點(例如'.cookiedomain.local')。

爲另一個子域(例如another.local)設置來自一個子域(例如one.local)的Cookie是不可能的。AFAIK。解決這個問題的方法是將用戶重定向到一個cookie域,該域設置/獲取所有cookie,並將用戶再次重定向到他們來自URL的cookies數據作爲查詢參數。微軟爲自己的域名(msn.com,microsoft.com)做了(或做過)它。


,你得到(「頭可能不包含...」),如果你作爲參數傳遞給header()字符串包含後面沒有空格或一個換行符時纔會觸發錯誤標籤(這將繼續下一行的標題)。

現在,setcookie()實際上是urlencode()它的值(setrawcookie()不會),所以換行不會導致錯誤。

另一方面,trim()函數將從其參數的開頭和結尾除去空白,並保留其他換行符不變。所以也許你可以嘗試像preg_replace('/\s+/', '')這樣的東西。

爲什麼setcookie()的方法不適合你對我來說不是非常明顯的。可能是因爲你實際上看到了cookie(使用setcookie()設置),但並不期望其中的url轉義,並且在你的代碼中某處默默拒絕。

但是,這並不能解釋爲什麼你的第一個header()似乎工作(與其中的換行);看起來你的一些cookie值有換行符,有些不行。

順便說一句,如果你希望子域能夠看到cookie,那麼將域設置爲'.local'(前導'。')是正確的。

PHP文檔(特別是用戶註釋)中討論了關於使用setcookie()設置Cookie的一些額外注意事項。

+0

我已經嘗試了所有這些。最初,我根本沒有修剪。我也試過setrawcookie(),儘管爲了簡單起見我沒有在這裏包含它。在Set-Cookie解決方案中,我也嘗試手動urlencode()處理$ token_id。我只是嘗試了preg_replace()的想法,它沒有改變任何東西。謝謝。 – 2009-09-03 00:04:06

+0

「標題可能不包含...」將不會觸發,除非您在此處有換行符。我查看了PHP源代碼('sapi_header_op()')。你肯定有這個錯誤的換行問題。 – Inshallah 2009-09-03 01:39:24

+0

我最終追查的內容與您的編輯相匹配。只要我嘗試「.local.com」,一切都很順利。在這種情況下,問題是因爲我的開發環境讓我的「域名」保持簡單。它不應該成爲生產環境中的問題。謝謝你的幫助。 – 2009-09-03 11:34:06