Приложение Facebook Iframe с несколькими страницами в переменных сеанса Safari не сохраняется - PullRequest
15 голосов
/ 22 апреля 2010

У меня есть приложение Facebook Iframe с несколькими страницами PHP.

У меня есть некоторые ссылки, которые указывают на файлы внутри моей "папки iframe".

Возникли некоторые проблемы с сеансомпеременные внутри фрейма.Я установил некоторые переменные сеанса, но они не сохраняются с одной страницы на другую.

Это работает в других браузерах.

Я читал, что Safari не поддерживает междоменные файлы cookie иэто может быть проблемой, но я не уверен, как это исправить.

Любая помощь?

Ответы [ 8 ]

11 голосов
/ 24 ноября 2010

Я считаю, что это решение устарело с последними (6.0 и более поздними) версиями Safari.

Safari по умолчанию не позволяет устанавливать файлы cookie от третьих лиц. Это влияет на приложения iframe Facebook, потому что пользователь получает доступ к странице, обслуживаемой с apps.facebook.com, но iframe обслуживается с yourdomain.com, в данном случае «третьей стороной».

В сети упоминается несколько решений. Лучшее, что я нашел и рекомендовал Facebook в списке различных проблем , - это подделка запроса POST на yourdomain.com с помощью JQuery. Это решение, детализированное Анант Гарг , в целом работает для разных доменов хоста / iframe и должно быть адаптировано для приложений Facebook. Ключевые части:

$("body").append('
 <iframe id="sessionframe" name="sessionframe" onload="submitSessionForm()" src="http://www.yourdomain.com/blank.php" style="display:none;"></iframe>
 <form id="sessionform" enctype="application/x-www-form-urlencoded" 
   action="http://www.yourdomain.com/startsession.php"
   target="sessionframe" method="post"></form>');
var firstTimeSession = 0;
function submitSessionForm() {
  if (firstTimeSession == 0) {
    firstTimeSession = 1;
    $("#sessionform").submit();
  }
}

Другое решение Уилла Хендерсона заключается в том, чтобы снабдить каждую ссылку на вашей странице информацией о сеансе с помощью функции Javascript. Затем измените код своего сервера, чтобы получить эту информацию о сеансе, считывая ее из параметров GET.

11 голосов
/ 30 апреля 2010

Я написал в блоге Доминик ссылается в своем ответе.

Проблема заключается в том, что поведение Safari по умолчанию заключается в приеме файлов cookie только с посещаемых вами сайтов.Это исключает «сторонние» куки.Safari рассматривает страницу внутри IFRAME как сторонний сайт, и до тех пор, пока вы не будете взаимодействовать с этим контентом (например, нажав ссылку), он будет отклонять эти файлы cookie.

В вашем PHP-коде необходимо установитьфайл cookie на первой странице, который использует сеанс для того, чтобы этот сеанс сохранялся с одной страницы на другую, но если переменные сеанса находятся на самой первой странице в IFRAME, у вас возникла проблема с курицей и яйцом.

Мое решение - сохранить все специальные параметры Facebook до второй страницы, загруженной в IFRAME.Поскольку вы взаимодействовали с ним, файлы cookie, установленные на второй странице, сохранятся, и это позволит вашему PHP-коду сохранять любое состояние, необходимое для обратной связи с Facebook.

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

1 голос
/ 09 сентября 2012

Safari принимает файлы cookie только со страницы, на которую переходит пользователь. Самый простой и эффективный способ исправить это - перенаправить запрос с целевой страницы вашего приложения Canvas на другую страницу вашего домена с помощью top.location.href и перенаправить пользователя обратно на приложение Canvas с этой страницы.

Например, если abc.php - ваша целевая страница, а URL-адрес холста - facebook.com/abc. Сначала перенаправьте запрос из abc.php на другую страницу, например, xyz.php, затем снова перенаправьте с xyz.php на facebook.com/abc. Не забудьте начать сеанс в xyz.php.

Это простое исправление ...

1 голос
/ 24 апреля 2012

Я думаю, что лучшее решение - это вручную отслеживать идентификатор сеанса, т. Е. С помощью session_id($_GET['session]); Просто убедитесь, что вы делаете это перед вызовом session_start();, и все работает.

0 голосов
/ 26 октября 2013

С выходом Safari 7 блокируются не только сторонние файлы cookie. Локальное хранилище, а также WebDB, любые данные сайта блокируются. Когда вы переходите в «Настройки Safari» (CMD + запятая), на вкладке «Конфиденциальность» в Safari 7 теперь появляется сообщение: «Блокировать файлы cookie и другие веб-сайты », изначально это было «Блокировать файлы cookie». Это подтверждает изменения.

В будущем могут появиться другие браузеры. Скорее всего Firefox. Хром, кашель * кашель *, вероятно, нет.

Возможно, вам придется использовать какой-то обходной путь, используя технику перенаправления или всплывающее окно, подобное тому, что сделал disqus.

0 голосов
/ 10 октября 2012

Я использовал этот заголовок с PHP, чтобы исправить мои проблемы

if ( strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') ) header('P3P:CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"');
0 голосов
/ 16 июня 2011

Если вы используете .NET, тогда есть гораздо более простое решение этой проблемы.

Просто установите cookieless в false в вашем файле web.config. Пример:

sessionState mode="InProc" cookieless="true" timeout="60" 

Это намного проще, чем разместить iframe или открыть всплывающее окно с URL-адресом iframe.

С уважением,

David

0 голосов
/ 14 марта 2011

и спасибо за весь вклад. Я решил проблему, добавив параметр «sign_request» на каждой странице. Я просто поместил это как скрытое поле и установил это в коде позади. Таким образом мне удалось заставить его работать в Safari. Надеюсь, что это работает и для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...