如何使用hashbang网址处理Facebook分享/喜欢?

时间:2012-01-17 10:46:41

标签: ajax facebook mod-rewrite pushstate hashbang

我正在建立一个网站,从主页我将在网站上打开一些其他URI到一个灯箱(AJAX),我想使用HTML5推送状态和哈希刘海作为后备来管理状态的变化。

现在我希望网址可以抓取,Facebook可以共享/可爱..

如果用户浏览器支持HTML5推送状态,没问题,他可以共享URL(例如:http://myserver/example),Facebook会在静态内容中找到合适的OG元数据。

但是如果用户使用HTML4浏览器,他将拥有类似http://myserver/#!/example的网址。我希望他能够通过facebook分享它...

现在看起来Facebook支持_escaped_fragment_替换方法,所以我只是简单地重定向来自http://myserver/?_escaped_fragment_=/example的请求 到http://myserver/example 每个人都应该开心......

所以我在我的htaccess中添加了重写条件:

RewriteCond %{QUERY_STRING} ^_escaped_fragment_=([^&]*)
RewriteRule .* http://%{HTTP_HOST}/%1? [R=301,L,NE]

我的问题是我无法让它与Facebook一起工作,有了Facebook linter它似乎百分之一地逃脱了hashbang之后的URL的一部分,导致网址像 http://myserver/%2Fexample登陆404: - (

有谁知道如何欺骗Facebook不逃避这部分网址? 我可以在apache mod_rewrite端做点什么吗?

我也对任何其他有效的ajax可抓取/可爱URL策略持开放态度;)

3 个答案:

答案 0 :(得分:17)

我认为http://facebook.stackoverflow.com/questions/8896773/opengraph-on-ajax-based-website的答案为如何实现这一目标提供了一些非常好的建议。

以下是内容:


没有。 Open Graph标记必须存在于使用纯HTTP GETable的HTML页面上。

这是因为当用户与OG对象交互时(比如,执行操作等),Facebook将在OG URL上执行HTTP GET,并期望看到标记中返回的OG标记。

解决方案是为每个对象创建规范网址。这些URL包含基本的HTML标记,包括OG标记。

在对这些URL的请求中,如果您看到包含“facebookexternalhit”的传入useragent字符串,则呈现HTML。如果不这样做,则提供302重定向到您的ajax URL。在ajax URL上,您发布的类似按钮和任何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的刮刀,则只需返回代表艺术家Monet的标记。

对于真实世界的例子,请看Deezer,Rdio和Mog都使用这种设计模式。

答案 1 :(得分:4)

我结束使用php header()重定向,它完美地运行:

if(isset($_GET['_escaped_fragment_'])) {
    Header( "HTTP/1.1 301 Moved Permanently" );
    header('Location: http://'.$_SERVER['HTTP_HOST'].$_GET['_escaped_fragment_']);
    die();
}

我不知道为什么在使用htaccess重写条件时我会获得转义字符。

答案 2 :(得分:-1)

如果您使用以下语法,则可以在Facebook上共享hashbang网址:https://stackoverflow.com/a/6138879/372838