Сеансы Safari и php не работают в facebook iframe

У меня возникла проблема с тем, чтобы приложение facebook работало над Safari.

Эта проблема связана с переменными сеанса PHP.

Я знаю, что у Safari есть проблема, связанная с междоменными сессиями (внутри iframe), и я нашел около двух типов решений:

  1. Настройка заголовка p3p: я пробовал много p3p-заголовков, но ни один из них не работал [например: header('P3P: CP="NOI ADM DEV COM NAV OUR STP"'); ].
  2. Отправка сообщения в iframe, используя javascript. Это создает взаимодействие, и сеансы должны работать. Но факт в том, что я не контролирую контейнер iframe, так как это facebook.

Кто-нибудь знает альтернативное решение?

Благодаря!

EDIT: подтверждено, этот обходной путь больше не работает в Safari 5.1 на Mac. Обсуждаемое здесь: Safari 3rd party cookie iframe trick больше не работает?

Я не знаю, в чем ваш прецедент, но в нашем приложении у нас есть экран приветствия с кнопкой «Разрешить доступ», которая открывает диалог разрешений. Когда пользователь нажимает «Разрешить доступ», я использую его для открытия нового окна, которое устанавливает сеанс и немедленно закрывается (это было предложено в вопросе, указанном выше). После того, как пользователь разрешил доступ, вы можете просто перезагрузить страницу? В нашем случае это не требуется, так как вся связь с сервером выполняется с помощью 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(); } } ); 

В startession.php я только начинаю сессию:

 <?php session_start(); 

Я опаздываю на это, но это может помочь кому-то еще решить эту проблему.

Единственным способом, который я мог бы сделать, было обнаружение сафари изнутри моего 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>'; ?> 

его немного хромой, но он работает и не мешает другим браузерам. Другой метод – использовать всплывающее окно, хотя мое сафари по умолчанию было заблокировано.

безусловно, не самое приятное решение, но вам не нужны никакие дополнительные страницы, которые помещают Решение в первую позицию на вашей странице, чтобы вы видели только мерцание белого.

 <?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(); } ?> 

отправьте свой ссылочный url на страницу, где вы действительно делаете свой материал. ничего не нужно. затем возвращайтесь к странице, на которой вы были в первую очередь.