如何在不进入无限循环的情况下将网站重定向到Facebook画布URL

How to redirect a site to the Facebook canvas URL without going to an infinite loop?

本文关键字:重定向 网站 Facebook URL 画布 情况下 无限循环      更新时间:2023-09-26

如果我的Facebook画布页面指向mydomain.com,并且用户直接转到mydomain.com时,我如何使该网站显示在Facebook画布页面上?基本上,我希望我的网站总是加载在Facebook画布上。如果我只是重定向到apps.facebook.com/mydomain,我认为它会进入一个无限循环,因为facebook画布正试图加载mydomain.com.

检查HTTP请求标头中的referrer,并在此基础上进行逻辑处理。话虽如此,我不知道将你的整个网站重定向到Facebook是否能很好地解决你的问题。

一个更好的解决方案是在一个单独的页面或域上托管Facebook应用程序部分,并从首页链接到它。

您可以在客户端用javascript实现。检查页面当前是否在iframe内打开,如果不是这样,你不在facebook内,应该执行重定向:

如果(window.parent===window)执行重定向

你可以找到一种在服务器端实现它的方法,但是,除非facebook在加载时传递一些特定的参数,否则你可能需要依赖HTTP_REFERER参数,浏览器不会总是发送它。

如果您的应用程序正在Facebook中加载,则页面将被POST到,POST数据将包含一个signed_request字段。这可以在服务器上用来发现用户是否正确访问了应用程序——如何在iframe中的导航中保持这些信息取决于您。

客户端可以检查window !== top/canvas/.test(window.name)

我在另一个问题上发现了这一点,并在我自己的脚本中使用:

<script type="text/javascript">
  function NotInFacebookFrame() {
    return top === self;
  }
  function ReferrerIsFacebookApp() {
    if(document.referrer) {
      return document.referrer.indexOf("apps.facebook.com") != -1;
    }
    return false;
  }
  if (NotInFacebookFrame()) {
    top.location.replace("https://apps.facebook.com/YOUR_APP_NAMESPACE");
  }
</script>

这会检查他们目前是否在Facebook框架中,*只有当他们不在时,它才会将他们重定向到"https://apps.facebook.com/YOUR_APP_NAMESPACE"

注意:您可以在应用程序的任何页面上使用此功能,只需相应地更改URL即可。

例如:如果您在http://YourDomain.com/anotherpage.php您可以将上面代码中的URL更改为https://apps.facebook.com/YOUR_APP_NAMESPACE/anotherpage.php