Safari和php会话无法在facebook iframe中运行

时间:2012-04-03 10:31:22

标签: php facebook iframe safari session-variables

我有问题让我的Facebook应用在Safari上工作。

该问题与PHP会话变量有关。

我知道Safari在处理跨域会话(在iframe内部)时遇到问题,我找到了两种类型的解决方案:

  1. 设置p3p标头:我已经尝试了很多p3p标头,但没有人工作[例如:header('P3P: CP="NOI ADM DEV COM NAV OUR STP"');]。
  2. 使用javascript将帖子发送到iframe。这会创建交互,会话应该有效。但事实是我不控制iframe容器,因为那是facebook。
  3. 有没有人知道另一种解决方案?

    谢谢!

3 个答案:

答案 0 :(得分:3)

编辑:确认,此解决方法不再适用于Mac上的Safari 5.1。这里讨论:Safari 3rd party cookie iframe trick no longer working?

我不知道你的用例是什么,但在我们的应用程序中,我们有一个带有“允许访问”按钮的欢迎屏幕,可打开权限对话框。当用户单击“允许访问”时,我使用该窗口打开一个新窗口,设置会话并立即关闭(这是在上面链接的问题中提出的)。用户允许访问后,您可以重新加载页面吗?在我们的例子中,这不是必需的,因为与服务器的所有通信都是使用ajax。


我正在使用第二个解决方案并且没有问题,这是我的代码(使用jQuery):

/**
 * Hack for Safari cross-domain cookies. See: 
 * http://anantgarg.com/2010/02/18/cross-domain-cookies-in-safari/
 */

$(document).ready( function() {

    var isSafari = (/Safari/.test(navigator.userAgent));

    if (isSafari) {
        var iframe = $( "<iframe />" );
        iframe.attr( "id", "cookieframe" );
        iframe.attr( "name", "cookieframe" );
        iframe.hide();

        var form = $( "<form />" );
        form.attr( "id", "cookieform" );
        form.attr( "target", "cookieframe" );
        form.attr( "enctype", "application/x-www-form-urlencoded" );
        form.attr( "action", "startsession.php" );
        form.attr( "method", "post" );

        $("body").append( iframe );
        $("body").append( form );
        form.submit();
    }

} );

在startsession.php中,我刚刚开始会议:

<?php session_start();

答案 1 :(得分:3)

我迟到了,但它可能会帮助其他人查找这个问题。

我能做的唯一方法就是从我的iframe中检测safari,然后立即重定向到另一个页面,我可以设置会话cookie - 然后重定向回来。

<?php
// sort out ie with the below header
header('P3P:CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"');
session_start();
$_SESSION = array();

// if Safari and no cookies have been set yet, take me to another page to set a session cookie
if (strpos($_SERVER['HTTP_USER_AGENT'], 'Safari') && !strpos($_SERVER['HTTP_USER_AGENT'], 'Chrome')) {
    if (count($_COOKIE) === 0) {
     echo '<script> 
     top.location = "http://www.domain.com/setcookie.php";
     </script>';
    }
}
?>

然后从setcookie.php

<?php
//inside setcookie.php
header('P3P: CP="CAO PSA OUR"');
session_start();
$_SESSION = array();

echo 
'<script>
top.location = "http://www.backtooriginaldomain.com"; 
</script>';
?>
它有点蹩脚,但确实有效,并且不会干扰其他浏览器。另一种方法是使用弹出窗口,虽然我的safari默认阻止它。

答案 2 :(得分:0)

到目前为止还不是最好的解决方案,但您不需要任何额外的页面 将解决方案放在页面的第一个位置,这样您只能看到一些白色的闪烁。

<?php
if (isset($_GET['safarifix'])) {
    session_start();
    echo '<script type="text/javascript">top.location = \''.$_GET['safarifix'].'\'</script>';
    exit();
}

if (!isset($_COOKIE, $_COOKIE['PHPSESSID'])) {
    header('P3P: CP="CAO PSA OUR"');
    echo '<script type="text/javascript">top.location = document.URL + "?safarifix=" + encodeURIComponent(document.referrer)</script>';
    exit();
}
?>

将您的推荐网址发送到您实际执行操作的页面。 没有其他需要。 然后回到你最初的页面。