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']; 
?>