5

我在过去一天半的时间里一直在解决一个问题,但仍未找到解决方案。

当在 facebook(在 facebook 的 iFrame 中)访问我的游戏时,php 会话不起作用。这适用于 IE 和 Safari。铬工作正常。

我已经阅读了堆栈上有关此问题的所有帖子,这似乎取决于第三方 cookie 安全性并且需要首先与 iFrame 交互。有一种解决方法是先让 javascript 将一些表单数据发布到 iFrame,但这似乎已在最近版本的浏览器中“修复”,因为这不再有效。

我什至尝试实现一个起始页面,要求他们首先单击一个链接(在 iFrame 中)以加载另一个页面,然后创建会话。但即使这样也行不通。

我什至使用 javascript 在 iF​​rame 中加载新页面也遇到了麻烦,这似乎总是会导致无限循环刷新。

不,P3P 标头不能解决它。

有没有人可以解决这个问题?考虑到存在多少 Facebook 应用程序,我不能成为唯一一个拥有它的人!

4

2 回答 2

5

我使用禁用了“接受第三方cookies”的客户端遇到了这个问题。我的解决方案是通过将此行放在每个页面的开头来强制 PHP 将会话 ID 嵌入到 URI 中:

ini_set('session.use_trans_sid', true);

由于 URL 位于 Facebook 内的 iframe 中,因此顶部窗口中看不到 SID。

于 2012-06-14T17:48:05.150 回答
3

对于 IE,您将需要 P3P 标头集。就像是:

<?php header('P3P: CP="CAO PSA OUR"'); ?>

默认情况下,Safari 会阻止 3rd-party cookie。目前,唯一对我有用的解决方法是“弹出”一个新窗口来设置 cookie。我有这样的事情:

<script type="text/javascript">
    function safariFix(){
        if (navigator.userAgent.indexOf('Safari') != -1 && navigator.userAgent.indexOf('Chrome') == -1){
            window.open('https://yourdomainname.com/safari.php', 'Safari Fix','width=100,height=100');
        }
    }
</script>

safari.php会有这个:

<?php 
setcookie("safari_test", "1");
?>
<!DOCTYPE html>
<html lang="en">
    <head>
        <title>Safari Fix</title>
        <script src="//ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"></script> 
    </head>
    <script type="text/javascript">
    $(document).ready(function(){
        window.close();
    });
    </script>
    <body>
        Since Safari does not accept third-party cookies by default, we are forced to open this window.
        This window will automatically close once we have set the cookies.
    </body>
</html>

问题:如果用户在 Safari 中启用了“阻止弹出窗口”,这将不起作用。如果有人对此有更好的解决方案,请告诉我;)

于 2012-08-09T23:23:11.173 回答