我相信这article'll有用: http://www.how2guru.com/archives/php-session-problem-while-using-iframe/
简短的回答是:在iframe中,像这样开头的会议:
header('P3P: CP="CAO PSA OUR"');
session_start();
编辑:
思想我应该更新这个答案,因为我偶然发现了每个人都应该知道的有趣事情。
此p3p标头破解不适用于safari。
下面我描述了我的登录流程,以及我如何解决这个问题。
我的登录流程看起来像这样(页面应用程序):
- 检查当前用户会话,
- 如果不是,重定向到登录URL(由PHP SDK生成),
- 登录对话框重定向回一个url,我使用'code'GET参数Facebook给我,得到一个访问令牌,我可以存储它以备将来使用。 (保存到会话的数据库和)。如果我完成了这个工作,我将用户重定向到我的页面应用程序,在那里一切都会工作。
- 此时大家都应该高兴。
但是这里来了一个问题。
如果用户使用Safari浏览器,并尝试打开该应用程序时,会议早已见怪不怪(几天后的前)被破坏,下面的事情发生:
- 的代码检查会话:它找到用户ID(PHP SDK的getUser()方法),所以我首先检查数据库中的条目。
- 由于用户之前登录过,他在数据库中有一个条目,所以我只抓住它并将它保存到一个会话中,这样未来的AJAX调用将拥有他们需要的所有信息。
这里需要注意的重要一点是,此代码在iframe中的页面选项卡中运行。
因此,对于大多数用户来说,由于p3p标头破解,代码将起作用。
但是对于safari用户来说,它不会。
Safari不关心给定标,它拒绝保存会话,因此该应用程式的用户登录,一切似乎都做工精细,但AJAX调用不会起作用,因为他们赢得了”没有任何会议可以使用。
解决方法:
很其实很简单 - 虽然不太优雅,但嘿,它的工作原理。 - :我检查客户端浏览器是否是Safari浏览器,如果是,我重定向到自定义网址,我在其中启动会话 - 在facebook iframe之外 - 然后重定向回应用程序。
这将创建没有问题的cookie,因此会话将可用。
在这里,有一些代码:
检查会议 (Credit goes to this guy)
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)
header('P3P: CP="CAO PSA OUR"');
session_start();
$_SESSION = array();
echo
'<script>
top.location = "http://back-to-the-facebook-app.com";
</script>';
我希望这个额外的技巧将有助于某人。
EDIT2
我没有尝试这一个还没有,但不是添加的P3P头,你可以只添加以下行到你。htaccess的:
<IfModule mod_headers.c>
Header set P3P "policyref=\"/w3c/p3p.xml\", CP=\"IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT\""
</IfModule>
搭配点评:
# ------------------------------------------------------------------------------
# | Cookie setting from iframes |
# ------------------------------------------------------------------------------
# Allow cookies to be set from iframes in IE.
# http://msdn.microsoft.com/en-us/library/ms537343.aspx
# http://www.w3.org/TR/2000/CR-P3P-20001215/
<IfModule mod_headers.c>
Header set P3P "policyref=\"/w3c/p3p.xml\", CP=\"IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT\""
</IfModule>
一切归功于此为Yeoman项目背后的家伙.htacces代码。
如果您在iframes页面上有session_start(),则应该没有问题。 – Chibuzo
我有一个基于cookie的会话在我的iframe中不工作的问题。这是因为我正在测试的浏览器已禁用**第三方Cookie。 –