我有一个网站,这是完全基于Ajax(散列导航)。
有没有办法使用Javascript为基于ajax的网站刷新Open Graph元标记?(当我点击一个链接时,标签和这些值应该会改变)
发布于 2012-01-17 23:17:25
不是的。开放图形标记必须出现在超文本标记语言页面,这是GETable与纯超文本传输协议。
这是因为当用户与OG对象交互(例如,执行操作等)时,Facebook将在OG URL上执行HTTP GET,并期望在标记中看到返回的OG标记。
解决方案是为每个对象创建规范的URL。这些URL包含基本的HTML标记,包括OG标记。
在对这些URL的请求中,如果您看到传入的useragent字符串包含'facebookexternalhit‘,那么您将呈现HTML。如果您不这样做,您将提供一个302,它将重定向到您的ajax URL。在ajax URL上,like按钮和您发布的任何OG操作都应该指向规范的URL对象
示例:
作为一个用户,我使用的是http://yoursite.com/#!/artists/monet。我单击了一个like按钮,或者发布了一个操作,但是like按钮的href参数,或者当您发布操作时对象的URL应该是该对象的web可点击的规范URL -在本例中,可能是http://yoursite.com/artists/monet
当使用浏览器的用户点击http://yoursite.com/artists/monet时,你应该将他们重定向到http://yoursite.com/#!/artists/monet,但是如果传入的用户代理说这是Facebook的抓取器,你只需返回代表艺术家莫奈的标记即可。
有关真实世界的示例,请参见Deezer、Rdio和Mog,他们都使用此设计模式。
发布于 2013-02-22 20:59:29
再多做一点调查就会得出以下结论:
假设您创建了一个散列如下的应用程序:
http://yoursite.com/#/artists/monetFacebook的抓取器将调用你的网址,而不是/#/artists/monet部分。这是一个问题,因为您无法知道必须将哪些信息解析到meta og: tags中。
然后尝试使用建议的url,就像Simon说的:
http://yoursite.com/#!/artists/monet现在你会注意到Facebook的抓取器遵守了google ajax specifications,它会将#!转换成?_escaped_fragment_=,所以URL看起来像这样:
http://yoursite.com/?_escaped_fragment_=/artists/monet你可以用facebook的调试器自己检查一下:https://developers.facebook.com/tools/debug
将php脚本上传到您的服务器
/#/部件转到facebook
/#/
/#!/
?_escaped_fragment_=
脚本
<html>
<head>
<title>Scraping</title>
</head>
<body>
<?
print_r($_SERVER);
?>
</body>
</html>或者总结:始终使用/#!/ (哈希)深度链接;)
发布于 2016-05-18 00:35:22
我运行了一个似乎有效的快速测试。依赖于FB刮板不运行JavaScript这一事实。
由于我的大多数站点都是静态的单页面应用程序,没有服务器逻辑,所以我可以使用Grunt和Gulp等工具快速生成静态页面。
如果您共享http://wh-share-test.s3-website-eu-west-1.amazonaws.com/test
当用户点击JS重定向到/#/test的链接时,Facebook将抓取测试页面的meta标签,以便我的单页面应用程序做出反应并显示正确的视图。
看起来有点老生常谈,但很管用;
<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="utf-8" />
<title>This is a shared item</title>
</head>
<body>
<h1>This is a shared item page.</h1>
<script>
var path = window.location.pathname;
window.location = '/#' + path;
</script>
</body>
</html>https://stackoverflow.com/questions/8896773
复制相似问题