2010-12-17 166 views
7

我開發了一個Facebook應用程序。簡單地說,這款應用在大多數瀏覽器上都能正常工作(我在FF,Chrome和Safari上測試過它,並且它們在所有瀏覽器上運行良好)。然而,當我在IE8測試,我在試圖讓一個AJAX調用的一個頁面時,此錯誤消息:Facebook應用程序適用於所有瀏覽器,但不適用於IE8

Fatal error: Uncaught Exception: 102: Requires user session thrown in 
/home1/website/public_html/facebook/src/facebook.php on line 515 

這比包含行515 facebook.php功能:

protected function _restserver($params) { 
    // generic application level parameters 
    $params['api_key'] = $this->getAppId(); 
    $params['format'] = 'json-strings'; 

    $result = json_decode($this->_oauthRequest(
    $this->getApiUrl($params['method']), 
    $params 
), true); 

    // results are returned, errors are thrown 
    if (is_array($result) && isset($result['error_code'])) { 
    throw new FacebookApiException($result); 
    } 
    return $result; 
} 

我的猜測是,這是要做的會議或與IE8設置,但我不知道如何解決這個問題。

回答

22

嘗試在你的PHP文件的頂部添加此標題:

<?php 
    header('p3p: CP="NOI ADM DEV PSAi COM NAV OUR OTR STP IND DEM"'); 
?> 

這將使跨域AJAX在IE調用工作

編輯:

其實從長遠正確答案如下:

當開發一個IFrame Canvas應用程序(或任何其他iframe託管在頁面中的一個difer ent域名)訪問cookie(稱爲第三方cookie)在某些條件下(默認IE配置)受到限制。 Firefox,Chrome,Safari,Opera均可按預期工作,但IE會阻止訪問此Cookie。這個頭的存在(稱爲P3P Compact Privacy Policy)將使IE接受來自不同域的Cookie。

這是如何讓你的會話代碼工作?

那麼爲了維護服務器中的會話信息,頁面會發佈一個存儲在客戶端的會話cookie。如果您的iframe使用會話,則必須允許瀏覽器存儲cookie。

落入存儲cookie意味着會話將丟失,基於會話的代碼將失敗,如您發佈的。

希望這會有所幫助。

PS:順便說一句我不知道p3p頭文件中所有奇怪的縮略語是什麼意思。我已經看到它的許多變體的工作,所以你應該嘗試調查一下更多關於它

+2

哇。這當然是一條神奇的路線。它工作完美(我不得不關閉並打開IE8刷新Ajax消息)。這條線是做什麼的? – khr2003 2010-12-17 03:43:32

+0

我會編輯我的答案以解釋它的作用 – 2010-12-17 04:42:17

+2

非常感謝您的解釋。我做了一些研究,這裏是解釋奇怪縮寫詞的鏈接:http://www.p3pwriter.com/LRN_111.asp – khr2003 2010-12-17 07:44:14

0

如果您運行在Microsoft .net平臺上,您可以在IIS中設置P3P標頭。

看到下面的鏈接,但你可以跳過關於必須有一個政策的XML文件,並直接刪除頭添加!

http://support.microsoft.com/kb/324013

+0

我只想告誡人們不要認爲添加P3P標題可以解決所有Cookie問題。它將圍繞IE中的常見場景開展工作,但如果明確禁用第三方cookie(通過瀏覽器安全設置或通過附加cookie管理器),則P3P標頭的存在不會有任何區別。通過在iframe應用程序中使用cookie,您總會在這裏和那裏丟失一些用戶。希望不多,但總是一些。如果這是不可接受的,請不要使用cookies。 – 2011-09-13 08:59:29

相關問題