【发布时间】:2012-03-20 21:14:20
【问题描述】:
我有一个 facebook 页面选项卡 iframe,并希望访问浏览器 url 以获取当前 facebook 页面 url。
我知道由于浏览器安全问题,无法使用与父框架交互的 javascript。
一种不适用于所有浏览器的方法是从请求中读取 HTTP_REFERER 标头。
有没有更好的办法?
【问题讨论】:
我有一个 facebook 页面选项卡 iframe,并希望访问浏览器 url 以获取当前 facebook 页面 url。
我知道由于浏览器安全问题,无法使用与父框架交互的 javascript。
一种不适用于所有浏览器的方法是从请求中读取 HTTP_REFERER 标头。
有没有更好的办法?
【问题讨论】:
我希望这根本不可能。否则这将是一个安全问题,可能会被关闭。
您不应该根据损害其他用户的利益来编写代码。
【讨论】:
由于跨域策略,无法获取父 Frame 的 URL。并且无法获取有关您的应用程序在客户端运行的页面的信息。
但在服务器端,您可以使用signed_request 中传递的详细信息重建页面 URL。对于页面选项卡应用程序,它包含 page:
一个 JSON 对象,包含页面
idstring、likedboolean(如果用户喜欢该页面,则设置为true,如果不是,则设置为false)和admin@987654333 @(如果用户是页面管理员,则设置为true,如果不是,则设置为false)。
使用该页面 ID,您可以构建页面 URL:
http://www.facebook.com/pages/-/PAGE_ID
如果您希望在您的应用程序中链接到您的页面选项卡,请使用:
http://www.facebook.com/pages/-/PAGE_ID?v=app_APPLICATION_ID
注意,HTTP_REFERRER 是客户端提供的,不可信,可能会被插件/代理/等切断...
注意事项:
页面在现实生活中可能有不同的 URL,但使用这种技术,用户将登陆正确的页面,因为 Facebook 会发出重定向到页面的正确 URL。
示例 URL 使用 HTTP 方案,如果需要,请随时使用 HTTPS。
以 PHP 为例,您可以像这样检测当前方案:
$scheme = ((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS']!=="off") ||
(isset($_SERVER['HTTP_X_FORWARDED_PROTO']) &&
$_SERVER['HTTP_X_FORWARDED_PROTO']=="https")
) ? 'https' : 'http';
【讨论】:
HTTP 替换为 HTTPS(它也会按预期工作),您可以检测当前用户方案并使用它来代替使用硬编码的协议方案...
HTTPS 服务器页面)。
根据我的经验,HTTP_REFERRER 可能无法按预期工作。如果标签应用程序是为特定页面设计的(我想应该是这样),您是否尝试过重新创建它?
https://www.facebook.com/MYPAGENAME/app_MYAPPID
其中 MYPAGENAME 是您的页面名称,MYAPPID 是应用程序 ID,当然。
如果标签应用于多个页面,我很确定您会从https://graph.facebook.com/PAGEID 获得相关数据以应用上述内容,其中 PAGEID 是您从signed request 获得的页面 ID .
【讨论】: