PHP处理URL中的片段标识符

时间:2012-06-09 03:10:25

标签: php javascript facebook meta-tags fragment-identifier

我在这里陷入了两难境地,希望得到社区的一些建议。这是我的问题:

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

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

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

这非常有效,当人们加载页面时,我的AJAX请求成功请求'123'文章。但我刚刚在所有文章上实现了一个类似Facebook的按钮,现在我已经碰到了一堵砖墙。

基本上,Facebook找到与您的“喜欢”内容关联的缩略图和标题以及网址的方式是检查传递到fb中的网址的元标记,例如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从原始文件中获取元标记页面,对于那些有类似问题的人。

感谢。

3 个答案:

答案 0 :(得分:3)

如果您可以重新设置网站以使用hashbang #!网址,则Facebook会稍微悄悄地支持Google's AJAX crawling spec

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

答案 1 :(得分:2)

的index.php 只需回传会话[&#39;参考&#39;]当它被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 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'];
?>

答案 2 :(得分:0)

PHP的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'