5

我在这里遇到了很大的困境,希望社区提供一些建议。这是我的问题:

我创建了一个包含大量动态内容的网站,所有内容都通过 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 like 请求中使用 get 参数,对于直接链接使用片段标识符。

但这会带来以下问题:

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

对不起文字墙!感谢您提供的任何意见。

编辑:我刚刚测试了我提出的涉及两者组合的解决方案,我可以确认 Facebook 遵循重定向,所以这个解决方案根本不起作用。这很令人沮丧!

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

谢谢。

4

3 回答 3

3

如果您可以重新调整您的网站以使用 hashbang #!URL,那么 Facebook 在某种程度上默默地支持Google 的 AJAX 抓取规范

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

于 2012-06-09T05:09:40.817 回答
2

index.php 只是简单地回显 session['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>

Navigasyon.php 所有的魔法都在这里发生!只需通过 ajax 将片段发送到 navg.php 并将其注册到会话中,并在确保终止刷新循环索引时从服务器响应相同的片段 php 添加 /kill 片段并停止

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'];
?>
于 2012-08-05T00:52:08.370 回答
0

PHP's parse_url function returns everything including the hash fragment, so you could either use parse_url and access the fragment key of the returned array

$url = 'http://www.mysite.com/home#/123';
$parts = parse_url($url);
$fragment = $parts['fragment']; // => '/123'

or alternatively pass in the component flag PHP_URL_FRAGMENT, and just retrieve the fragment itself

$fragment = parse_url($url, PHP_URL_FRAGMENT); // => '/123'
于 2012-06-09T04:52:15.540 回答