2011-11-01 70 views
19

我遇到了CakePHP應用程序的問題。這似乎只發生在IE中,並且僅在某些計算機上。它在發生這種事情的計算機上是一致的。CakePHP Cookie /會話問題

問題之一: 用戶已經登錄並https://example.com/users/view在頁面上點擊並註銷。用戶被重定向到http://example.com,並且似乎被註銷,直到用戶訪問另一個https頁面,並且他們仍然登錄。他們可以多次單擊註銷,但他們總是通過https登錄並僅登錄HTTP。

問題二:在https://example.com/users/signin他們將被重定向到http://example.com現在出現 用戶日誌中記錄用戶去https://example.com/admin/slides,不知道它,但現在已經退出,點擊任何其他網頁上(。或者刷新當前頁面)會要求他們重新登錄。

我不知道發生了什麼事。我已閱讀並嘗試瞭解決這兩個類似問題的解決方案:Session not saving when moving from ssl to non-sslCookie not renewing/overwriting in IE,但我仍然遇到同樣的問題。 (我不知道這是否意味着什麼)是當我在HTTP頁面上同時調試$_SESSION$this->Session->read()時總是隻有$ this-> Session-> read()返回一個值。在HTTPS頁面上,一些總是返回相同的值,其他人總是隻返回$ this-> Session-> read()的值。

例如,http://example.comhttps://example.com/users從來沒有看到$ _SESSION,https://example.com/carts總是看到$ _SESSION。我不確定,但我想,也許安全頁面應該看到它,因爲有些不可能有可能是錯誤的,但是當我檢查代碼時,我看不出有什麼區別,說明它爲什麼會這樣做,噸。

此外,如果我將$this->Session->destroy()添加到AppController中的beforeFilter,那麼所有頁面甚至HTTP都可以看到$ _SESSION。我實際上並沒有在我的應用程序中使用$ _SESSION,我只是認爲這可能是什麼錯誤的線索。


UPDATE

我tooked古斯塔夫·伯特倫的意見,並看了看用戶代理字符串。我將計算機上遇到問題的IE瀏覽器的用戶代理字符串與計算機上沒有問題的IE進行了比較。除了有問題的用戶代理字符串中有「谷歌瀏覽器框架」之外,它們是相同的。我從那臺電腦上卸載了Google Chrome Frame,重新啓動,再次嘗試,問題似乎解決了。

如果這是真正的原因,那麼簡單的解決方案是讓用戶卸載Chrome框架。不過,我想知道是否有解決方案可以讓他們安裝鉻框架並仍能正常工作。

+0

(我認爲你已經淘汰了平常的緩存嫌疑人。)哪些版本的IE?修改頁面標題(緩存控制,等 - 請參閱http://support.microsoft.com/kb/234067)有什麼影響? – OpenSorceress

+0

會話內容是亂碼還是其他?可能是安全選項.. – Dunhamzzz

+0

頁面是否有任何Flash內容?您是否嘗試將會話安全性從HIGH更改爲LOW? – binoy

回答

16

嘗試添加以下到您的core.php中的文件:

Configure::write('Session.checkAgent', false); 
Configure::write('Session.ini',array('session.cookie_secure' => false, 'session.referer_check' => false)); 

這些參數應該強制餅乾甚至可以通過谷歌Chrome Frame的堅持。這將設置PHP和CakePHP的設置,以允許cookie通過http和https持久化。

+0

想到我會提到這些是CakePHP 2.0參數。它們在1.3中可能有點不同,但應該允許您在登錄時在http和https之間導航。 –

+0

它看起來像1.3的語法,在1.3中工作,沒有錯誤。 :)這似乎確實解決了問題,即使安裝了鉻框架。你知道爲什麼Cake首先檢查代理嗎?對不起,我已經捐出了這筆賞金,但當我這樣做的時候,它即將耗盡。 –

+0

這是一項安全措施。我認爲,默認情況下,它希望安全cookie只在安全連接中有效。如果你去http,那麼它不再安全。所以,在這裏,我們基本上已經把它關掉了。不用擔心賞金。真高興你做到了! –

6

我的建議是,你直接看看數據包,看看發生了什麼事。

在客戶機上安裝Wireshark,並連接到遠程Web服務器。 (Wireshark會忽略本地主機的流量。)

我懷疑你的cookies是不是受到了破壞(我曾經有一些餅乾被PHP弄壞了!)或者他們被卡住了(這會是IE的錯誤)。無論哪種方式,您都會獲得更多關於發生問題的信息。

作爲最後的手段,檢查代碼中的用戶代理字符串是否有問題/不支持的IE版本,並督促人們進行升級。

+0

我給你賞金自從你的建議看着用戶代理是什麼導致我發現鉻框架問題。儘管如此,我仍然想找出一種方法使其可以與Chrome框架一起工作。 –

+0

顯然你可以插入一個標籤[強制IE瀏覽器使用Chrome瀏覽器渲染引擎](http://www.zdnet.com/blog/google/google-chrome-frame-hijacks-ie-and-is-現在考慮的穩定/ 2485)。如果這不能給你帶來歡樂,那可能是bug報告時間。 –

-1

您是否確定在關閉php之後沒有任何空格或換行符?>標記?也許這是你檢查的第一件事,但根據經驗我知道,嚴重關閉的php標籤確實會導致php會話處理的零星問題。

0

試着把它放在你的AppController的beforeFilter中,看看它是否做了什麼。我有一種感覺,cookie設置沒有像你需要配置。 See here欲瞭解更多信息。

function beforeFilter() { 
    $this->Cookie->domain = '.example.com'; 
    $this->Cookie->secure = false; 
}