我已经在最后一天半的时间里解决了一个问题,现在还没有找到解决方案。
当我在facebook上访问我的游戏时(在facebook的iFrame中),PHP会话无效。这适用于IE和Safari。 Chrome工作正常。
我已经阅读了有关此问题的堆栈上的所有帖子,这似乎取决于第三方Cookie安全性,并且需要首先与iFrame进行交互。有一种解决方法是让javascript首先将一些表单数据发布到iFrame,但这似乎已经在最新版本的浏览器中被“修复”,因为它不再有效。
我甚至尝试实现一个起始页面,要求他们首先点击一个链接(在iFrame中)以加载另一个页面然后创建会话。但即使这样也行不通。
我甚至无法使用javascript在iFrame中加载新页面,这似乎总是会导致无限循环刷新。
不,P3P标题不解决它。
有没有人能解决这个问题?考虑到有多少Facebook应用程序存在,我不能成为唯一拥有它的人!
答案 0 :(得分:5)
我使用禁用“接受第三方Cookie”的客户端遇到此问题。我的解决方案是强制PHP将会话ID嵌入到URI中,方法是将此行放在每个页面的开头:
ini_set('session.use_trans_sid', true);
由于网址位于Facebook内的iframe中,因此顶部窗口中未显示SID。
答案 1 :(得分:3)
对于IE,您需要设置P3P标头。类似的东西:
<?php header('P3P: CP="CAO PSA OUR"'); ?>
Safari默认阻止第三方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中启用了“阻止弹出式窗口”,则无效。如果有人有更好的解决方案,请通知我;)