Это связано с тем, что Facebook теряет все переменные аутентификации и не может определить, что параллельные запросы принадлежат одному и тому же сеансу, что приводит к "разрыву" iframe и появлению на страницах вашего собственного сервера, а не в Facebook .
Каждый раз, когда страница обслуживается через Facebook, запрос, полученный на вашем сервере, будет включать в себя несколько переменных GET, отправленных Facebook, эти переменные в совокупности известны как «подпись аутентификации Facebook», которая доказывает вашему серверу, что запрос действительно является действителен от Facebook; аналогичным образом, когда ваш сервер отправляет ответ, включение этих переменных в Facebook (посредством комбинации session_key, api_key и sig digest) подтверждает, что ваш сервер является приложением, которое, как он утверждает, является.
Чтобы сохранить сеанс в приложении iframe, не выходя на сервер, вы должны включить эти параметры в строку запроса каждой ссылки. Вот простая функция, которая создаст для вас строку запроса, поэтому вам просто нужно добавить результат этой функции к каждому URL-адресу ссылки в вашем приложении:
function fb_sig_urlQueryString() {
$query = '';
foreach ($_GET as $k => $v) {
if (strpos($k, 'fb_sig') === 0) {
if ($i++ > 1) $query .= '&';
$query .= $k.'='.$v;
}
}
return $query;
}