Как я могу принудительно перенаправить обратно на вкладку страницы Facebook, если пользователь просматривает за пределами Facebook?

Что-то не так с вкладкой моей страницы — я получил уведомление Facebook о том, что кто-то оставил комментарий в поле для комментариев на вкладке моей страницы, StackOverflow щелкнул ссылку, и я был перенаправлен на страницу моего сайта напрямую:

Вот URL, который привел меня туда:

Как я могу это исправить, StackOverflow, по которому пользователь щелкает URL-адрес в своем уведомлении Facebook, вместо этого приведет их сюда: http://www.Facebook.com/SEHabitat?sk=app_175821802509443


person Ian Mason    schedule 17.11.2011    source источник


Ответы (4)


Ответ Даниэля Цыганка - это решение на стороне сервера, оно хорошо и защищено от несанкционированного доступа.

Однако, если у вас есть люди, стоящие за прокси-серверами, которые удаляют поле реферера HTTP, менее безопасным способом является использование JavaScript.

<script type="text/javascript">
    if (self==top)
        location = "//www.facebook.com/SEHabitat?sk=app_175821802509443";
</script>
person Jeow Li Huan    schedule 20.11.2011

Если пользователь просматривает страницу напрямую, вы увидите запрос GET.

Если они просматривают вкладку через Facebook, ваша страница будет загружена с помощью POST (с некоторыми параметрами, «подписанными» Facebook с использованием секрета вашего приложения, но обман этого перенаправления, вероятно, не является проблемой безопасности, поэтому у вас нет заботиться об этом).

person Alf    schedule 17.11.2011

Вы можете проверить, откуда пользователь был перенаправлен, и если он не был перенаправлен с вкладки facebook (если я правильно помню, URL-адрес начинается с static.facebook), вы перенаправляете его на страницу. что-то вроде этого:

  $ref=$_SERVER['HTTP_REFERER'];
  if ($ref != "static.facebook...") {
      Header ('Location: http://www.facebook.com/SEHabitat?sk=app_175821802509443');
  }
person Daniel Tsyganok    schedule 17.11.2011

Я использую сочетание серверных и клиентских сценариев для достижения того, о чем вы просили. Предполагая, что php является вашим языком на стороне сервера, в большинстве случаев должно работать что-то вроде приведенного ниже:

<?php
$app_id = "<your app id>";
$page_url = "<your page url>";
// if your app requires extended permissions
$app_scope = "user_interests,publish_actions,publish_stream"; //etc.

// depending on your requirement you may use the oauth authentication
// or you may simply redirect to your page url instead
$auth_url = "https://www.facebook.com/dialog/oauth?client_id=" 
        . $app_id . "&redirect_uri=" . urlencode($page_url)
        . "&scope=" . $app_scope;

// this is passed only when your page is pulled by facebook
if (!isset($_REQUEST["signed_request"])) {
    // we are sure that the page is not accessed within facebook
    // so we may redirect
    header ('Location: ' . $auth_url); // or $page_url
    die();
}

$signed_request = $_REQUEST["signed_request"];

list($encoded_sig, $payload) = explode('.', $signed_request, 2); 

$data = json_decode(base64_decode(strtr($payload, '-_', '+/')), true);

// we can check this and redirect later
$user_id = $data["user_id"];

// other details are also avialable
$user = $data["user"];
$algorithm = $data["algorithm"];
$issued_at = $data["issued_at"];
$oauth_token = $data["oauth_token"];
$expires = $data["expires"];

// passed only when the app is loaded inside a page tab
// can be checked for and if empty we can redirect
$app_data = $data["app_data"];

// signed_request algorithm's signature verification
// is omitted here for simplicity sake. you may perform
// that to ensure the authenticity of the request

// other initial setups
?>

Теперь вы можете поместить приведенный ниже скрипт внутри тега <head> </head> на своей странице:

<script type="text/javascript">
    <?php if (empty($user_id)): // or as may the need be, you may want to check $app_data instead ?>
        top.location.href="<?php echo $auth_url; // or you may want to use $page_url instead ?>";
</script>
person eMAD    schedule 19.06.2012