2012-06-09 41 views
5

我在这里有一个相当困难,并希望来自社区的一些建议。这是我的问题:PHP中处理URL中的片段标识符

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

但这带来了下列问题:

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

对不起,对文本的墙!欣赏您可以提供的任何输入。

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

编辑编辑:实现我的“混合”的想法一种可能的方式是使用了window.location重定向,而不是PHP header()函数调用的重定向,所以Facebook的从原来的页面抓取meta标签,对于那些你有类似的问题。

谢谢。

+0

为什么Javascript不能更改URL的GET参数? –

+1

我希望所有在SO上的新海报都能显示您所显示的努力量和研究量...... – jprofitt

+1

Cheers jprofitt! Scott:GET参数不能被JavaScript修改而不会导致重定向。 Window.location以不同方式处理片段标识符和查询字符串。 – scrapii

回答

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' 
+0

可能的碎片不会通过电线从客户端发送到服务器。此PHP解析仅对内部服务器URL操作有用,否? – DragonLord

3

如果你能rejigger您的网站的hashbang #!网址,Facebook的有些悄悄支持Google's AJAX crawling spec

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

2

index.php 只是回应会议['参考'],当它通过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']; 
?>