2010-12-17 101 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

相关问题