[英]Safari and php sessions not working in facebook iframe
我在使我的Facebook應用程序在Safari上運行時遇到問題。
該問題與PHP會話變量有關。
我知道Safari在處理跨域會話(在iframe中)時遇到問題,我發現了大約2種類型的解決方案:
header('P3P: CP="NOI ADM DEV COM NAV OUR STP"');
]。 有人知道替代解決方案嗎?
謝謝!
我對此很遲,但是它可能會幫助其他人查找此問題。
我唯一可以做的方法是從iframe內部檢測野生動物園,並立即重定向到另一個頁面,在該頁面中可以設置會話cookie-然后重定向回去。
<?php
// sort out ie with the below header
header('P3P:CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"');
session_start();
$_SESSION = array();
// if Safari and no cookies have been set yet, take me to another page to set a session cookie
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
<?php
//inside setcookie.php
header('P3P: CP="CAO PSA OUR"');
session_start();
$_SESSION = array();
echo
'<script>
top.location = "http://www.backtooriginaldomain.com";
</script>';
?>
它有點la腳,但是可以正常工作並且不會干擾其他瀏覽器。 另一種方法是使用彈出窗口,盡管我的野生動物園默認情況下將其阻止。
編輯:確認,此解決方法不再適用於Mac上的Safari 5.1。 此處討論: Safari 3rd party cookie iframe技巧不再起作用?
我不知道您的用例是什么,但是在我們的應用程序中,我們有一個歡迎屏幕,帶有“允許訪問”按鈕,可打開權限對話框。 當用戶單擊“允許訪問”時,我使用它來打開一個新窗口,該窗口設置會話並立即關閉(這是在上面鏈接的問題中提出的)。 用戶允許訪問后,您可以重新加載頁面嗎? 在我們的情況下,由於與服務器的所有通信都使用ajax,因此不需要這樣做。
我正在使用第二種解決方案,對此沒有任何問題,這是我的代碼(使用jQuery):
/**
* Hack for Safari cross-domain cookies. See:
* http://anantgarg.com/2010/02/18/cross-domain-cookies-in-safari/
*/
$(document).ready( function() {
var isSafari = (/Safari/.test(navigator.userAgent));
if (isSafari) {
var iframe = $( "<iframe />" );
iframe.attr( "id", "cookieframe" );
iframe.attr( "name", "cookieframe" );
iframe.hide();
var form = $( "<form />" );
form.attr( "id", "cookieform" );
form.attr( "target", "cookieframe" );
form.attr( "enctype", "application/x-www-form-urlencoded" );
form.attr( "action", "startsession.php" );
form.attr( "method", "post" );
$("body").append( iframe );
$("body").append( form );
form.submit();
}
} );
在startsession.php中,我只是開始會話:
<?php session_start();
到目前為止,這不是最好的解決方案,但是您不需要任何額外的頁面,只需將解決方案放在頁面的第一位置即可,這樣您只會看到一些白色閃爍。
<?php
if (isset($_GET['safarifix'])) {
session_start();
echo '<script type="text/javascript">top.location = \''.$_GET['safarifix'].'\'</script>';
exit();
}
if (!isset($_COOKIE, $_COOKIE['PHPSESSID'])) {
header('P3P: CP="CAO PSA OUR"');
echo '<script type="text/javascript">top.location = document.URL + "?safarifix=" + encodeURIComponent(document.referrer)</script>';
exit();
}
?>
將您的引薦網址發送到您實際進行操作的頁面。 不需要額外的東西。 然后返回到您最初的頁面。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.