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

时间:2010-04-22 14:51:21

标签: facebook safari

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

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

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

这适用于其他浏览器。

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

任何帮助?

8 个答案:

答案 0 :(得分:11)

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

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

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

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

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

答案 1 :(得分:11)

我相信这个解决方案已经过时了最新的(6.0及更高版本)Safari版本。

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

网上提到了几种解决方案。我发现的最好的和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参数中读取它来捕获此会话信息。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

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

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

如果您使用.NET,则可以使用更简单的解决方案来解决此问题。

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

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

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

亲切的问候,

大卫

答案 6 :(得分:0)

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

其他浏览器将来可能会继续使用。最有可能是Firefox。 Chrome,咳嗽 *咳嗽*可能不会。

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

答案 7 :(得分:-1)

我在PHP中使用了这个标题来修复我的问题

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"');