Я верю, что эта статья будет полезна:
http://www.how2guru.com/archives/php-session-problem-while-using-iframe/
Краткий ответ: в iframe запустите сессию так:
header('P3P: CP="CAO PSA OUR"');
session_start();
EDIT:
Думаю, мне следует обновить этот ответ, поскольку я наткнулся на что-то интересное, о чем все должны знать.
Этот хак заголовка p3p не работает в сафари .
Ниже я опишу поток входа в систему и то, как я решил эту проблему.
Мой поток входа выглядит так (страница приложения):
- проверка наличия сеанса у текущего пользователя,
- , если нет, перенаправить на URL входа в систему (генерируется PHP SDK),
- диалоговое окно входа перенаправляет обратно на URL, где я использую параметр «code» GET, который дает мне facebook, чтобы получить токен доступа, который я могу сохранить для дальнейшего использования. (Сохранение в БД и в сеансе.) Если я закончу с этим, я перенаправлю пользователя в свое приложение страницы, где все будет работать.
- все должны быть счастливы в этот момент.
НО вот идет гатча.
Если пользователь использует сафари и пытается открыть это приложение, когда сеансы уже уничтожены (например, через несколько дней), произойдет следующее:
- Код проверяет сеанс: он находит идентификатор пользователя (метод PHP SDK getUser ()), поэтому сначала я проверяю запись в базе данных.
- Поскольку пользователь вошел в систему ранее, у него есть запись в базе данных, поэтому я просто беру ее и сохраняю в сеансе, чтобы будущие вызовы AJAX имели всю необходимую информацию.
Здесь важно отметить, что этот код запускается на вкладке страницы в iframe.
Так что для большинства пользователей код будет работать из-за взлома заголовка p3p.
Но для пользователей сафари это не так.
Safari не заботится о заданном заголовке, он отказывается сохранять сеанс, поэтому пользователь входит в приложение, все, кажется, работает нормально, но вызовы ajax не будут работать, так как они не будут иметь любой сеанс для работы.
Обходной путь:
Довольно просто на самом деле - хотя и не слишком элегантно, но эй, это работает. -: я проверяю, является ли браузер клиента сафари или нет, и если это так, я перенаправляю на пользовательский URL-адрес, с которого начинаю сеанс - вне фрейма facebook, - а затем перенаправляю обратно в приложение.
Это создаст куки без проблем, поэтому сессии будут доступны.
Здесь есть код:
Надеюсь, этот дополнительный прием кому-нибудь поможет.
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>
Вся заслуга в этом .htacces-коде для парней, стоящих за проектом Yeoman .