基于Ajax的网站上的OpenGraph
OpenGraph on Ajax Based Website
我有一个网站,它完全基于Ajax(哈希导航)。
有没有一种方法可以使用Javascript为基于ajax的网站刷新Open Graph元标签?(当我点击链接时,标签和那里的值应该会改变)
否。Open Graph标记必须存在于可通过纯HTTP获取的HTML页面上。
这是因为当用户与OG对象交互时(比如执行操作等),Facebook会对OG URL执行HTTPGET,并期望在标记中看到返回的OG标记。
解决方案是为每个对象创建规范的URL。这些URL包含基本的HTML标记,包括OG标记。
在对这些URL的请求中,如果看到包含"facebookexternalhit"的传入useragent字符串,则呈现HTML。如果您不这样做,您将提供一个302重定向到您的ajax URL。在ajax URL上,您发布的类似按钮和任何OG操作都应该指向规范的URL对象
示例:
作为用户,我在http://yoursite.com/#/艺术家/monet。我点击了一个点赞按钮,或者发布了一个操作,但点赞按钮的href参数,或者发布操作时对象的URL,应该是该对象的可在网络上点击的规范URL——在这种情况下,也许http://yoursite.com/artists/monet
当使用浏览器的用户点击http://yoursite.com/artists/monet你应该将它们重定向到http://yoursite.com/#/艺术家/莫奈,但如果传入的用户代理说这是Facebook的scraper,你只需返回代表艺术家莫奈的标记。
有关真实世界的示例,请参阅Deezer、Rdio和Mog,他们都使用这种设计模式。
多一点调查就会得出以下结果:
假设您制作了一个应用程序,其哈希如下:
http://yoursite.com/#/artists/monet
Facebook scraper将调用您的url,而不包含/#/artists/monet
部分。这是一个问题,因为您无法知道要解析到meta og: tags
中的信息。
然后尝试与西蒙所说的相同的建议网址:
http://yoursite.com/#!/artists/monet
现在您会注意到,Facebook scraper尊重googleajax规范,它会将#!
转换为?_escaped_fragment_=
,因此URL看起来像这样:
http://yoursite.com/?_escaped_fragment_=/artists/monet
你可以用facebook调试器自己检查一下:https://developers.facebook.com/tools/debug
- 将php脚本上传到服务器
- 转到facebook调试器
- 输入带有
/#/
部分的url - 点击"查看我们的scraper为您的URL看到的内容"-没有哈希片段
- 使用
/#!/
再次输入url - 单击"查看我们的scraper为您的URL所看到的内容"-哈希片段已转换为
?_escaped_fragment_=
脚本
<html>
<head>
<title>Scraping</title>
</head>
<body>
<?
print_r($_SERVER);
?>
</body>
</html>
或者总结一下:总是使用/#!/
(hashbang)深度链接;)
我运行了一个似乎有效的快速测试。这取决于FB scraper不运行JavaScript的事实。
由于我的大多数网站都是静态的单页应用程序,没有服务器逻辑,我可以使用Grunt和Gulp等工具快速生成静态页面。
如果您共享http://wh-share-test.s3-website-eu-west-1.amazonaws.com/test
Facebook会抓取测试页面的元标签,当用户点击JS重定向到/#/test的链接时,我的单页应用程序会做出反应并呈现正确的视图。
看似粗鲁,但行之有效;
<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>
- 如何识别我的网站中的慢速设备
- 用Javascript更改我网站上的字体大小
- 有任何可能将facebook实时信使整合到一个网站中
- 将电视直播频道从网站嵌入我的网站
- Windows 8固定的网站互动程序
- 门户网站:当地时间有多有用
- 正在删除node.js中已验证的网站
- 为什么在这个网站上不能通过JS访问元素
- 需要使用谷歌应用程序脚本列出谷歌域下的所有网站
- 为什么只有工厂在棱角分明的网站上被提及
- 从应用程序脚本检查谷歌网站访问权限
- 使用谷歌网站翻译器自动翻译网页
- 使用node.js制作网站
- 谷歌如何确定网站加载时间
- 带有url的单页网站导航
- Ajaxify Wordpress网站与社交插件
- 为什么可以't Protractor在自动初始化的Angular网站上查找Angular
- 在我的网站上显示最近提交的文章/图片
- 如何检测负责网站某些部分的JavaScript根文件
- 如何更改网站上显示的文本