我在这里遇到了一个两难境地,希望社区提供一些建议。这是我的问题:
我创建了一个包含大量动态内容的网站,所有内容都通过 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请求或查询字符串?即:
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在某种程度上悄悄地支持谷歌的AJAX抓取规范。
遇到包含 #!
的 URL 时,它会自动将该文本和以下文本转换为 GET 友好的查询字符串?_escaped_fragment_=
。您的服务器端代码可以关闭该 GET 参数(如果存在)。
索引.php只是回显会话['refer'],当它被Navigasyon刷新时.js id会在您输入的片段末尾添加一个/kill,以停止循环刷新过程!
<?php session_start(); ?>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Boom - test</title>
<script type="text/javascript" src="js/jquery.js"></script>
<script type="text/javascript" src="js/Navigasyon.js"></script>
</head>
<body onLoad="if (location.href.indexOf('/kill')==-1) location.replace(location.href+'/kill')">
<?php
//echo $_GET['url'];
//echo parse_url();
//echo $_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"].$_SERVER['PHP_SELF'];;
if (isset($_SESSION['refer']))
echo $_SESSION['refer'];
?>
</body>
</html>
纳维加松.php所有的魔术都发生在这里!只需通过 ajax 将片段发送到 navg.php 并将其注册到会话中,并在确保终止刷新循环索引时从服务器响应相同的片段 PHP 添加一个/kill frag 并停止
var whereAmI = window.location.hash;
var prsdUrl = window.location.hash.split("/");
var a = 0; //#!
var b = 1; //Sayfa dil
var c = 2; //Sayfa id
if(prsdUrl[a] == "#!")
{
$.post("navg.php", {
refer: whereAmI
},
function(data) {
//if(data='ref') document.location.reload();
if(data==whereAmI) {
if(prsdUrl[c] != 'kill') {
document.location.reload();
}
}
});
}
Navg.php你说说这部分发生了什么!
<?php
session_start();
$_SESSION['refer'] = $_POST['refer']; ?>
<?php echo $_SESSION['refer'];
?>
parse_url 函数返回包括哈希片段在内的所有内容,因此您可以使用 parse_url
并访问返回数组的 fragment
键
$url = 'http://www.mysite.com/home#/123';
$parts = parse_url($url);
$fragment = $parts['fragment']; // => '/123'
或者传入component
标志PHP_URL_FRAGMENT
,然后只检索片段本身
$fragment = parse_url($url, PHP_URL_FRAGMENT); // => '/123'