我在这里遇到了两难选择,并希望从社区中获得一些建议。这是我的问题:

我创建了一个包含很多动态内容的网站,所有内容都通过AJAX提取并通过JS显示。我目前允许直接链接到我的内容的方式是通过使用JS动态修改片段标识符,这是一个示例:

http://www.mysite.com/home#/123

其中123是内容的ID。当内容关闭时,它将再次剥离片段标识符。

这很好用,当人们加载页面时,我的AJAX请求成功地请求了“123”文章。但是我在所有文章上都实现了一个类似Facebook的按钮,现在我遇到了麻烦。

基本上,Facebook查找与您“喜欢”的内容相关联的缩略图和标题以及URL的方式是检查传递给fb的URL的元标记,例如iframe。它通过在URL上执行GET请求,检查元标记的内容,然后将其显示在Facebook上来实现此目的。

问题是片段标识符没有传递到服务器,因此我(我知道)在PHP中没有办法用特定请求的文章中的内容动态生成这些元标记。

例如,我希望能够执行以下操作:

$id_vals = get_id_values($hash_fragment);
echo '<meta property="og:title" content="'.$id_vals['title'].'" />';

您的第一个想法可能是:为什么不使用GET请求或查询字符串? IE。:

http://www.mysite.com/home?id=123

但是,这种方法的问题在于Javascript无法动态更改URL的这一部分,而只能更改片段标识符。这意味着所有指向我们文章的直接链接都需要刷新页面。这违背了我们一直沿用的整个“动态”方法-我可能会补充说,它的确很不错:)

所以我现在有点困惑。我能想到的唯一的半解决方案是同时使用两种方法:

在fb中,类似的请求使用get参数,而对于直接链接,则使用片段标识符。

但这带来了以下问题:
  • 如果用户将直接链接粘贴到Facebook,它将包含片段标识符,并且正确的元数据将不会显示在Facebook上。
  • 我需要做一些奇怪的重定向魔术来修复URL的格式以删除ID(即检测是否传入GET参数并重定向到等效的片段标识符)。但是我不知道FB是否还会遵循重定向并从重定向页面(而不是第一页面)中获取元标记,这无论如何都会有效地使该解决方案无用。

  • 对不起,文字墙!感谢您可以提供的任何输入。

    编辑:我刚刚测试了提议的解决方案,将两者结合使用,并且我可以确认Facebook遵循了重定向,因此该解决方案根本无法使用。这令人沮丧!

    编辑:一种实现我的“混合”想法的可能方法是使用window.location重定向而不是PHP header()调用重定向,因此Facebook会从原始页面获取元标记,对于那些使用类似的问题。

    谢谢。

    最佳答案

    如果您可以重新启动站点以使用hashbang #! URL,那么Facebook会在某种程度上悄悄地支持Google's AJAX crawling spec

    遇到包含#!的URL时,它将自动将其和以下文本转换为GET友好的查询字符串?_escaped_fragment_=。您的服务器端代码可以取消该GET参数(如果存在)。

    关于URL中的PHP处理片段标识符,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10958061/

    10-10 16:46