簡體   English   中英

Safari和PHP會話在Facebook iframe中不起作用

[英]Safari and php sessions not working in facebook iframe

我在使我的Facebook應用程序在Safari上運行時遇到問題。

該問題與PHP會話變量有關。

我知道Safari在處理跨域會話(在iframe中)時遇到問題,我發現了大約2種類型的解決方案:

  1. 設置p3p標頭:我嘗試了很多p3p標頭,但沒有一個有效[例如: header('P3P: CP="NOI ADM DEV COM NAV OUR STP"'); ]。
  2. 使用JavaScript將帖子發送到iframe。 這樣可以創建交互,會話應該可以正常工作。 但是事實是我不控制iframe容器,因為那是facebook。

有人知道替代解決方案嗎?

謝謝!

我對此很遲,但是它可能會幫助其他人查找此問題。

我唯一可以做的方法是從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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM