我在这里遇到了两难选择,并希望从社区中获得一些建议。这是我的问题:
我创建了一个包含很多动态内容的网站,所有内容都通过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遵循了重定向,因此该解决方案根本无法使用。这令人沮丧!
编辑:一种实现我的“混合”想法的可能方法是使用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/