URL 中的 PHP 处理片段标识符

PHP Processing Fragment Identifier in URL

本文关键字:片段 标识符 处理 PHP 中的 URL      更新时间:2023-09-26

我在这里遇到了一个两难境地,希望社区提供一些建议。这是我的问题:

我创建了一个包含大量动态内容的网站,所有内容都通过 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'];
?>
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'