2016-09-23 55 views
3

我有一個項目可以在本地服務器上運行,但不能在我的生產服務器上運行,因爲服務器沒有看到cookie。我做了再現該服務器上的問題的代碼的最小版本:

<?php 

if(!isset($_COOKIE['foo'])){ 
    setcookie('foo', 'bar', time() + 7*24*60*60, '/'); 
    echo "Cookie was not found, so we just created it."; 
} else { 
    echo "Cookie was found!"; 
} 

?> 

無論多少次,我刷新此頁面,我總是得到「未找到」的消息。每當我嘗試登錄$_COOKIE變量時,我都會得到一個空數組。但是:

  • 存在Cookie在瀏覽器中,並與
  • 設置cookie,並在同一個文件讀取(它不是與path問題)
  • 請求正確發送沒有setcookie之前輸出,並且該文件被編碼爲UTF8無BOM

我認爲這是一個服務器的配置問題,因爲代碼本地工作,但我不知道去哪裏找。有沒有人看過這個,你知道是什麼原因造成的嗎?

如果您需要更多信息,請告訴我,我會將其添加到我的問題。謝謝!

+0

任何涉及吞噬cookie的CDN和/或緩存服務器...? – deceze

+4

檢查您的服務器的php.ini以獲取'variables_order'指令。 「C」從它丟失了嗎? http://php.net/manual/en/ini.core.php#ini.variables-order –

+0

@deceze設置了一個Varnish緩存,但是這個頁面沒有被緩存。你認爲可以吞下餅乾嗎? @邁克爾,感謝您的建議,我檢查了一下,似乎沒問題:'variables_order = EGPCS' – blex

回答

1

如果涉及緩存服務器或CDN,則可能是基於白名單篩選cookie。這是爲了改善緩存,因爲每個具有一組獨特cookie的請求需要被視爲與其他請求不同,並且無法緩存(您可能會根據您的cookie從服務器收到不同的回覆,因此緩存服務器無法爲您提供以前客戶端的緩存響應)。由於許多服務都在設置可能發送到服務器的cookie(例如分析軟件包),但對響應內容完全沒有影響,默認情況下全部響應cookie通常會完全顛覆緩存。

配置緩存服務器負責專門關注您的cookie並將其轉發到原始服務器。如果您有許多不同的Cookie,請考慮爲他們提供一個通用前綴和白名單(例如foo-*)。

+0

很好的解釋。另外,感謝您提供有關前綴的提示,這可能對我有所幫助,避免每次需要新的cookie時詢問我的同事。 – blex

-1

我認爲你的問題是服務器時間。用time()函數檢查你的時間,並與當地時間進行比較。也許其中一個是錯的。

+0

感謝您的回答,但我已檢查過時間,並且與我的機器 – blex

0

我遇到了類似的問題,結果是HAProxy配置問題。你有服務器和用戶之間的負載平衡器嗎?

+0

相同感謝您的意見,是的,我會問我的同事。 – blex

相關問題