3

我正在构建一个通过apps.facebook.com 系统运行的Facebook 应用程序。这个问题不是专门针对 Facebook 应用程序的(所以如果您不熟悉这些应用程序,请不要停止阅读),但您很快就会明白为什么这很重要。

每当用户希望使用该应用程序时,他们首先会转到一个标准网站(地址更容易记住,我们以 xyz.com 为例),然后该网站会自动重定向到 Facebook 应用程序。但是,有两个可能的重定向目标:

  1. 到标准的 Facebook 应用程序页面(例如 apps.facebook.com/xyz)。如果客户端可以访问该页面,则应该会发生这种情况。重要的是,客户端可能无法访问此页面的一个原因是,如果他们位于运行阻止 Facebook 的内容过滤器(例如学校、大学、某些工作场所)的网络上。

  2. 如果客户无法访问 Facebook 应用程序页面,他们应该被重定向到主网站上的另一个页面(例如 xyz.com/nofacebook_login.html)。

如您所见,重定向决策需要基于客户端是否可以访问 Facebook 应用程序页面。因此,测试需要在客户端(大概)使用 Javascript、jQuery 或类似工具进行。但是,我不确定如何去做。

任何建议将不胜感激。

4

1 回答 1

4

由于同源策略,显而易见的解决方案(只需向远程域发送 AJAX 请求并查看响应是什么)不起作用。

你可以要求 Facebook 实现跨域资源共享协议。如果他们同意,剩下的就容易了。但是,如果不是,$.ajax- 或本地人XmlHttpRequest- 就不会这样做。

但是,虽然 XHR 受同源策略的约束,但发送 HTTP 请求的其他方式则不受限制:您可以创建一个带有src某个图像的图像 on apps.facebook.com,然后查看它是否加载。这里的问题是 facebook 提供其大部分内容来自akamaihd.net,不太可能与apps.facebook.com. 但是,我确实找到了一张来自以下网址的图片:http apps.facebook.com: //apps.facebook.com/images/spacer.gifhttp://facebook.com/images/spacer.gif也存在)。@RobW 还向我指出了 favicon(http://apps.facebook.com/favicon.ico

要测试是否可以加载图像:

  1. 创建一个新img元素
  2. 添加一个load监听器和一个error监听器,它将执行重定向
  3. 设置img src
  4. 不需要将图像添加到文档中,但我还没有在任何地方进行测试。
var img = document.createElement("img");
img.onload = function(){location.href = "http://apps.facebook.com/xyz"};
img.onerror = function(){location.href = "http://xyz.com/nofacebook_login.html"};
img.src = "//apps.facebook.com/favicon.ico"; //thanks @RobW
document.body.appendChild(img);

注意:Facebook 不保证任何一张图片都会一直存在。虽然它似乎很有可能会留下来,但它最终可能会消失。如果发生这种情况,每个人都会显示被阻止(您可能想检查错误代码,但我不知道阻止程序返回什么)。如果发生这种情况,请通知我或使用新的工作图像更新此答案。

于 2013-04-05T10:46:42.520 回答