Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 我如何知道我的应用程序正在Facebook内运行_Php_Facebook - Fatal编程技术网

Php 我如何知道我的应用程序正在Facebook内运行

Php 我如何知道我的应用程序正在Facebook内运行,php,facebook,Php,Facebook,如果我有一个应用程序,它在facebook上运行。第一批货我会拿到 $_REQUEST['signed_request'] 但是,如果您单击我的应用程序中的任何链接并在应用程序中导航,您将丢失该$\u请求['signed\u REQUEST'] 有没有其他方法可以知道我的应用程序是在浏览器中运行还是在facebook中运行?您可以继续传递签名请求。在你的应用程序中,你的所有链接都应该以?signed_request=(或者&signed_request=,如果已经有查询字符串),并且你的所有

如果我有一个应用程序,它在facebook上运行。第一批货我会拿到

$_REQUEST['signed_request'] 
但是,如果您单击我的应用程序中的任何链接并在应用程序中导航,您将丢失该
$\u请求['signed\u REQUEST']


有没有其他方法可以知道我的应用程序是在浏览器中运行还是在facebook中运行?

您可以继续传递
签名请求。在你的应用程序中,你的所有链接都应该以
?signed_request=
(或者
&signed_request=
,如果已经有查询字符串),并且你的所有帖子表单都应该包含signed_request作为隐藏输入。然后您将始终有权访问签名请求

您可以在中保存签名请求的值,如下所示:

session_start();
if (isset($_REQUEST['signed_request'])){
  $_SESSION['signed_request'] = $_REQUEST['signed_request'];
}
稍后,您可以检查已签名的_请求值是否保存在会话中:

if (isset($_SESSION['signed_request'])){
  //do something
}
如果你真的只需要知道你的应用程序是否正在通过Facebook访问,最简单的方法就是在你的应用程序设置中使用一个唯一的url——要么是像fb.yoursite.com这样的唯一主机名,要么是像www.yoursite.com/fbapp/这样的唯一目录名。然后配置服务器,使唯一的主机名/目录指向与常规主机名/目录相同的位置。通过这种方式,无论哪种方式都可以访问相同的文件,但是您的脚本可以检查$\u服务器信息,以判断这是否是Facebook请求


但是,除非你严格地处理非授权的访问,否则你必须考虑这是否真的能解决任何问题。如果你必须“检测”这样的东西,你不能携带任何持久状态信息,你的用户一进入第2页就会失去他的“身份”。因此,最有可能的是,你需要考虑的不是在每个页面上判断用户是否在Facebook,而是在第一个页面上解析你需要的所有信息,然后在所有其他页面上提供这些信息。许多人为此使用PHP会话。就我个人而言,我认为这是一个坏主意,而且会做一些更像Ben在回答中建议的事情(使用GET和POST传递您需要的信息)。

就我个人而言,我使用的一个非常简单但有效的解决方案是一些客户端javascript(显然可以禁用它等)-这对于简单的重定向非常有效,但不会在所有情况下都有效

// Redirect if the page is not an iframe
if (window.location == window.parent.location){
    window.top.location = '{{ facebook_tab_url }}';
};

我以前也这样做过一段时间,但现在我发现,当您打开一个新选项卡并直接转到iFrame的源代码时,这对您没有帮助,因为会话仍然存在。@SaschaGalley您使用什么技术来代替基于会话的方法?我也使用会话,我想不出任何其他可能性。我面临的问题是,当有人使用我的应用程序时(会话已设置),朋友喜欢此应用程序中的详细信息页面,用户单击该页面并登录到服务器url。我无法转发他,因为会话仍然认为他在iframe中。我通过向like url添加一个“like=1”参数来解决这个问题。如果设置了like,我将重定向到应用程序url。