我有一个使用Facebook Connect.js的Facebook应用程序。
我正在通过HTTPS运行我的应用程序。网站上的所有内容均来自https://
,但Facebook必须包含的内容除外Connect.js
问题在于我收到警告消息,指出页面中存在非安全项目。
我已经使用Chrome的开发者工具/网络标签检查了正在加载的脚本,以查看正在加载的文件以及从哪里加载。
我唯一可以看到的是通过HTTP而不是通过HTTPS加载的文件名为http://static.ak.facebook.com/connect/canvas_proxy.php
。
如何强制此文件使用HTTPS?
答案 0 :(得分:54)
<强> TL; DR 强>
在调用FB._https
之前,将true
设置为FB.init
。像这样:
FB._https = true;
FB.init({
/* your app id and stuff */
});
<强>解释强>
如果你解开Facebook JavaScript SDK,你会发现它基本上是一个带有一堆属性的对象文字。其中一个属性是_https
,它是一个布尔值。此属性确定在发出API请求时要使用哪些URL(存储在FB._domain
中)。似乎Facebook为每种类型的API请求保留两组URL - 安全URL和非安全URL - 然后使用名为getDomain()
的开关函数来确定在发出请求时使用哪种URL。 / p>
JavaScript SDK导致安全警告的原因是由于FB._https
属性的定义方式。这就是它目前在2011-8-24中的定义:
_https: (window.name.indexOf('_fb_https') > -1)
显然Facebook认为如果window.name
属性中包含_fb_https
,那么它必须是一个安全的应用程序。这显然是不正确的。真正的测试应该是这样的:
_https: window.location.protocol == "https:"
不幸的是,SDK不是开源的,甚至没有很好的文档记录,因此我无法提交此更改的拉取请求:P。在短期内,在调用FB._https
之前手动设置true
到FB.init
应该可以解决问题。
答案 1 :(得分:9)
所以这会给你相同的协议链接:
FB._https = (window.location.protocol == "https:");
答案 2 :(得分:8)
我几天前遇到过这个问题。我的整个应用程序都使用HTTPS,我的问题只是通过HTTP加载的个人资料图片...我的快速和肮脏的修复是手动替换所有个人资料图片的域名。例如,
str_replace('http://profile.ak.fbcdn.net','https://fbcdn-profile-a.akamaihd.net',$user['pic_square']);
您必须检查并查看个人资料图片的网址。我假设他们不是来自完全相同的地方。查看您自己的个人资料图片的网址,并替换我在https://fbcdn-profile-a.akamaihd.net
。
如果您需要通过安全连接返回图片,可以将return_ssl_resources参数设置为1:https://graph.facebook.com/4/picture?return_ssl_resources=1。
我找到了一个名为return_ssl_resources
的附加参数,当与true
一起传递时,它会使用HTTPS返回个人资料图片。
$fql = "SELECT uid, name, pic_square FROM user WHERE uid=me()";
$param = array( 'method' => 'fql.query', 'query' => $fql, 'return_ssl_resources'=>1);
$fbuser = $facebook->api($param);
它就像一个魅力,我停止了混合安全警告。我希望这有帮助!
答案 3 :(得分:2)
除了Ralph Holzmann和SimonBächler之外,以下是一个更难以解决的问题,因为FB ._ https 本身并不能解决问题;
FB._https = (window.location.protocol == "https:");
FB.init({
...
});
if (FB._https && window == window.parent) {
if (FB._domain && FB._domain.staticfb && FB._domain.https_staticfb)
FB._domain.staticfb = FB._domain.https_staticfb;
}
另见FB.Arbiter.inform(){... FB.getDomain((d?'https _':'')+'staticfb',true)...}其中d = window!= window.parent&amp; ;&amp; ...截至2012年2月10日。
答案 4 :(得分:1)
看起来FB._https已被替换为:
FB._secure = (window.location.protocol == "https:");
答案 5 :(得分:0)
这似乎是由Facebook bug引起的。
另见forum post。
该错误已在3/16标记为已解决,但我仍在观察对canvas_proxy.php的非https请求。希望这很快就能确定......
答案 6 :(得分:0)
在旁注中,如果您在HTML页面上有如下所示的文档类型声明,则对“http://www.w3.org”的引用也会在Internet Explorer中显示内容警告错误。< / p>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
答案 7 :(得分:0)
我遇到了类似的问题(fb评论无法在安全模式下工作)。这解决了它 - 只需通过https:
引用javascript文件<script type="text/javascript" src="https://connect.facebook.net/en_US/all.js"></script>
或者不指定方案适用于两者:
<script type="text/javascript" src="//connect.facebook.net/en_US/all.js"></script>