PHP处理URL中的片段标识符

5
我希望社区能够提供一些建议,因为我在这里遇到了一个相当棘手的问题。我的问题如下:
我创建了一个包含大量动态内容的网站,所有内容都是通过 AJAX 拉取并通过 JS 显示的。我目前允许直接链接到我的内容的方式是通过使用 JS 在飞行中修改片段标识符,以下是一个示例:

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

这里的123是内容的ID。当内容关闭时,它会再次去掉片段标识符。

这个方法非常有效,当人们加载页面时,我的AJAX请求成功地请求了“123”文章。但我刚刚在所有文章上实现了Facebook点赞按钮,现在我遇到了瓶颈。

基本上,Facebook找到与您“喜欢”的内容相关联的缩略图、标题和URL的方式是检查传递到fb like iframe的URL的元标记。它通过在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的一部分,它�能更改片段标识符。这�味�所有直�链�到我们文章的链�都需�页�刷新。这�我们整个“动��方法相�背 - 我必须补充的是,这真的很好🙂
所以我�在有点困惑。我唯一能想到的�解决方案是�时使用以下两�方法:
在Facebook的like请求中使用get�数,在直�链�中使用片段标识符。
但这会带�以下问题:
如�用户在Facebook上粘贴了一个直�链�,它将包括片段标识符,并且正确的元数��会在Facebook上显示。
我需��一些奇怪的�定�魔术�修�URL格�以删除ID(�检测是�传递GET�数并�定�到相应的片段标识符)。但我�知�FB是�也会�循�定�,并��定�的页���元标记,而�是第一页,这将使此解决方案无用。
抱歉让你看了这么多文字ï¼�感谢您æ��供的任何建议。 编辑:我刚刚测试了我的提议解决方案,结合两种方法,我可以确认Facebook遵循重定向,所以这个解决方案根本不起作用。这很令人沮丧!
编辑编辑:实现我的“混合”想法的一种可能的方法是使用window.location重定向而不是PHP header()调用重定向,这样Facebook就可以从原始页面获取元标记,适用于那些有类似问题的人。
谢谢。

为什么 JavaScript 不能更改 URL 的 GET 参数? - Scott Stevens
1
我希望所有在SO上的新贴子都能展示出你所付出的努力和研究的数量... - jprofitt
1
谢谢,jprofitt!Scott:GET参数在没有重定向的情况下无法通过JavaScript进行修改。Window.location会以不同的方式处理片段标识符和查询字符串。 - scrapii
JavaScript可以使用HTML5历史记录API来操作URL而不会导致页面重新加载。 - CBroe
3个回答

3
如果您能够重新配置站点以使用哈希bang #! URL,Facebook就会支持有些安静的支持Google的AJAX爬取规范
在遇到包含#!的URL时,它将自动将其及以下文本转换为GET友好的查询字符串?_escaped_fragment_=。如果存在该GET参数,则您的服务器端代码可以关键该参数。

2

index.php只是简单地回显session['refer'],当它被Navigasyon.js刷新时,会在你输入的片段末尾添加/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'];
?>

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'

可能客户端并没有通过网络将片段发送到服务器。这个PHP解析仅对内部服务器URL操作有用,不是吗? - DragonLord

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接