如果我有一个应用程序,它在Facebook内运行。第一次加载我会得到
$_REQUEST['signed_request']
但如果您点击我的应用内的任何链接并在应用内导航,您将失去$_REQUEST['signed_request']
。
有没有其他方法可以知道我的应用是在浏览器中运行还是在Facebook内运行?
答案 0 :(得分:1)
您可以继续传递signed_request
。在您的应用中,所有链接都应以?signed_request=<whatever>
结束(如果已有查询字符串,则为&signed_request=<whatever>
),并且所有POST表单都应包含signed_request作为隐藏输入。然后,您将始终可以访问signed_request
。
答案 1 :(得分:1)
您可以在php session中保存signed_request的值,如下所示:
session_start();
if (isset($_REQUEST['signed_request'])){
$_SESSION['signed_request'] = $_REQUEST['signed_request'];
}
稍后您可以检查session_request值是否保存在会话中:
if (isset($_SESSION['signed_request'])){
//do something
}
答案 2 :(得分:0)
如果真的只需知道您的应用是否通过Facebook访问,最简单的方法是在您的应用设置中使用唯一的网址 - 或者像fb.yoursite这样的唯一主机名。 com,或者像www.yoursite.com/fbapp/这样的唯一目录名称。然后配置服务器,使唯一的主机名/目录指向与常规主机名/目录相同的位置。这样可以通过任何一种方式访问相同的文件,但是您的脚本可以检查$ _SERVER信息以判断它是否是Facebook请求。
但是......除非你严格处理非授权访问,否则你必须考虑这是否能解决任何问题。如果你必须“检测”这样的事情,你不能携带任何持久的状态信息,并且你的用户一旦进入第2页就会失去他的“身份”。所以很可能,你需要考虑的是不是在每个页面上告诉用户是否在Facebook中,而是在第一页上解析您需要的所有信息然后在所有其他页面中使用的方法。许多人使用PHP会话。就个人而言,我认为这是一个坏主意,并且会做一些更像Ben在他的回答中建议的内容(使用GET和POST来传递你需要的信息)。
答案 3 :(得分:0)
就个人而言,我使用的一个非常简单但有效的解决方案是一些客户端javascript(显然可以禁用等) - 这对于简单的重定向非常有效,并且在每种情况下都不起作用。
// Redirect if the page is not an iframe
if (window.location == window.parent.location){
window.top.location = '{{ facebook_tab_url }}';
};