2013-04-05 146 views
3

我正在构建一个通过apps.facebook.com系统运行的Facebook应用程序。这个问题不是专门针对Facebook应用的(所以如果你不熟悉这些,不要停止阅读),但你会明白为什么这很重要。客户端网站可达性测试

每当用户想要使用应用程序,他们将首先到一个标准的网站(一个更难忘的地址,让我们使用xyz.com的例子),然后将自动重定向到Facebook应用程序。但是,有两种可能的重定向目标:

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

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

正如你所看到的,重定向的决定必须基于客户是否能够达到Facebook的应用程序页面,还是不行。因此,测试需要在客户端(大概)使用Javascript,jQuery或类似方法进行。但是,我不确定如何去做这件事。

任何建议将不胜感激。

+0

该滤镜的粒度如何?我们可以假设有一件事被封锁了,那么所有的东西都被封锁了吗? – 2013-04-05 07:31:47

+0

大多数网页过滤器都是基于域的(而不是基于页面),因此您可以假设如果apps.facebook.com被阻止,那么该(子)域上的所有内容都会被阻止。 – Skoota 2013-04-05 07:35:00

+0

现在我只需要找到可以在该域上测试的内容。如果我只是XHR,我会遇到同样的障碍 – 2013-04-05 07:38:50

回答

4

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

您可以要求Facebook实施Cross-origin resource sharing协议。如果他们同意,其余更容易。如果不是,则$.ajax或本地XmlHttpRequest不会。

但是,尽管XHR受到同源策略的限制,但发送HTTP请求的其他方式却不是:您可以使用src的某个图像创建一个图像,并在apps.facebook.com上查看它是否加载。这里的问题是,facebook提供的大部分内容来自akamaihd.net,这不太可能与apps.facebook.com共同阻止。然而,我确实发现一个图像来自apps.facebook.comhttp://apps.facebook.com/images/spacer.gifhttp://facebook.com/images/spacer.gif也存在)。 @RobW还指出我的图标(http://apps.facebook.com/favicon.ico

为了测试是否能够将图像加载:

  1. 创建一个新的img元素
  2. 添加load侦听器和一个error监听到它,将执行重定向
  3. 设置imgsrc
  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在保证图像会一直存在。虽然似乎有一个不错的机会,它可能会留下来,但最终可能会消失。如果发生这种情况,每个人都会出现阻塞(您可能想检查错误代码,但我不知道阻滞剂会返回什么)。如果发生这种情况,请通知我或使用新的工作映像更新此答案。

+1

'(location.protocol ==='https:'?'https:':'http:')+“//apps.facebook.com/favicon.ico”会更好,因为它使用正确的协议,并且图标不可能消失。 – 2013-04-05 10:51:03

+1

_“你可以要求Facebook执行” - 你是一个非常有趣的人。 – CBroe 2013-04-05 10:56:30

+0

@RobW:你可以使用'// apps.facebook.com /'而不必明确指定协议 - 然后浏览器将使用他自动加载主文档的协议。 – CBroe 2013-04-05 10:57:46