首页 文章

Facebook Iframe应用程序在Safari会话变量中有多个页面不会持续存在

提问于
浏览
15

我有一个带有多个PHP页面的facebook iframe应用程序 .

我有一些链接指向相对于我的“iframe文件夹”中的文件 .

在iframe中遇到会话变量的一些问题 . 我设置了一些会话变量,但它们不会从一个页面持久存在 .

这适用于其他浏览器 .

我一直在阅读Safari不支持跨域cookie,这可能是问题,但我不知道如何解决这个问题 .

有帮助吗?

8 回答

  • 1

    我写了the blog post多米尼克在他的回答中提到 .

    问题是Safari的默认行为是只接受您访问的站点的cookie . 这不包括“第三方”cookie . Safari将IFRAME中的页面视为第三方站点,并且在您与该内容进行交互(例如,通过单击链接)之前,它将拒绝这些cookie .

    您的PHP代码需要在使用会话的第一个页面上设置一个cookie,以便该会话从一个页面持久存储到另一个页面,但如果会话变量位于IFRAME的第一页,那么您有一个鸡和 - - 问题 .

    我的解决方案是将所有特殊的Facebook参数保留到加载到IFRAME中的第二页 . 因为您已经与它进行了交互,所以第二页上设置的cookie将保持不变,这样您的PHP代码就可以保持与Facebook通信所需的任何状态 .

    但是,这不太可能有助于您的PHP会话,因此我建议在第一页上的链接中添加另一个参数,以允许第二页查看会话,或以其他方式重新创建它 .

  • -1

    I believe this solution has become obsolete with the latest (6.0 and later) versions of Safari.

    Safari默认情况下不允许从第三方设置cookie . 这会影响Facebook iframe应用程序,因为用户正在访问从 apps.facebook.com 提供的页面,但iframe是从 yourdomain.com 提供的,在这种情况下是"third party" .

    网络上提到了几种解决方案 . 我发现的最好的和Facebook推荐的miscellaneous issues列表中的一个是使用JQuery伪造对 yourdomain.com 的POST请求 . Anant Garg详细介绍的此解决方案适用于不同的主机/ iframe域,需要针对Facebook应用进行调整 . 关键部分是:

    $("body").append('
     <iframe id="sessionframe" name="sessionframe" onload="submitSessionForm()" src="http://www.yourdomain.com/blank.php" style="display:none;"></iframe>
     <form id="sessionform" enctype="application/x-www-form-urlencoded" 
       action="http://www.yourdomain.com/startsession.php"
       target="sessionframe" method="post"></form>');
    var firstTimeSession = 0;
    function submitSessionForm() {
      if (firstTimeSession == 0) {
        firstTimeSession = 1;
        $("#sessionform").submit();
      }
    }
    

    Will Henderson的另一个解决方案是使用Javascript函数检测页面上的每个链接以及会话信息 . 然后通过从GET参数中读取它来修改服务器代码以捕获此会话信息 .

  • 11

    我认为最好的解决方案是手动跟踪会话ID,即使用 session_id($_GET['session]); 只需确保在调用 session_start(); 之前执行此操作,一切正常 .

  • 0

    Safari仅接受用户导航到的页面中的cookie . 解决此问题的最简单,最有效的方法是使用 top.location.href 将请求从画布应用程序的登录页面重定向到域中的其他页面,并将用户从该页面重定向回画布应用程序 .

    例如,如果abc.php是您的登录页面,并且画布URL是facebook.com/abc . 首先将请求从abc.php重定向到另一个页面,如xyz.php,然后再从xyz.php重定向到facebook.com/abc . 不要忘记在xyz.php中启动会话 .

    这是简单的修复......

  • 11

    并感谢所有的投入 . 我最后通过在每个页面上附加“signed_request”参数来解决问题 . 我把它作为一个隐藏的字段放入并将其设置在后面的代码中 . 这样我设法让它在Safari中工作 . 希望它也适合你 .

  • 1

    如果您使用.NET,那么这个问题就有了一个更简单的解决方案 .

    只需在web.config中将cookieless设置为false即可 . 例如:

    sessionState mode="InProc" cookieless="true" timeout="60"
    

    它比发布iframe或打开一个带有iframe网址的弹出窗口容易得多 .

    亲切的问候,

    大卫

  • 0

    随着Safari 7的发布,不仅第三方cookie被阻止 . 本地存储以及WebDB,任何类型的网站数据都被阻止 . 当您转到Safari首选项(CMD逗号),在Safari 7上的隐私选项卡下,它现在说:“阻止cookie和其他网站", originally was "阻止cookie” . 这证实了这些变化 .

    其他浏览器可能会在未来继续使用 . 最有可能是Firefox . 铬,咳嗽咳嗽可能不会 .

    您可能必须使用重定向技术或类似于disqus所做的弹出窗口的一些解决方法 .

  • 0

    我用PHP这个 Headers ,解决了我的问题

    if ( strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') ) header('P3P:CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"');
    

相关问题