2011-12-30 31 views
1

我正在創建一個基於ajax的網站,其中包含一個國家/州/城市瀏覽界面。對於SEO目的,我想在URL中包含國家/州/城市的名稱。例如,該URL可能包括額外的變量,會是這樣的:如何組織MVC中的國家/州/市瀏覽

http://www.website.com/browse#!USA/NY/Albany 
http://www.website.com/browse#!USA/NY/Albany?Category=sports 

我需要適應這個功能集成到一個MVC框架(特別笨)通過AJAX。我不確定如何組織主要組件,特別是Controller,AJAX Handlers和可能的Library類。有沒有標準或最佳實踐方法?

回答

1

是,谷歌寫了關於這個問題的一些好東西,特別是保持與片段標識符Ajax應用程序的狀態: http://code.google.com/web/ajaxcrawling/docs/specification.html

這裏的一些代碼,我把我的index.php文件來處理這個問題:

// Special handler for ajax partials ("AHAH" paradigm) 
if (isset($_GET['_escaped_fragment'])) 
{ 
    // Grab just the fragment 
    $fragment = $_GET['_escaped_fragment']; 

    // See if we have GET parameters to extract from the fragment 
    if (FALSE !== ($p = strpos($fragment, '?'))) 
    { 
     // Make sure to save additional GET parameters 
     $additional_params = array_diff_key($_GET, array('_escaped_fragment' => 1)); 

     // Parse the querty string 
     parse_str(substr($fragment, $p+1), $_GET); 

     // Add the originals back in 
     $_GET = array_merge($_GET, $additional_params); 

     // The beginning part of the fragment is the base URI 
     $fragment = substr($fragment, 0, $p); 
    } 

    // Otherwise, clear the $_GET array 
    else 
    { 
     $_GET = array(); 
    } 

    $_SERVER['PATH_INFO'] = $fragment; 
    $_SERVER['REQUEST_URI'] = $fragment; 

    // Add a constant for use throughout the app 
    define('IS_FRAGMENT', 1); 
} 
defined('IS_FRAGMENT') OR define('IS_FRAGMENT', 0); 

的方法是這樣的:

1)如果它是一個Ajax請求和IS_FRAGMENT == 1,則n只顯示了部分結果你以填充您的前端更改

2)否則,假設它是搜索引擎或直接頁面加載。顯示完整的頁面。

您不應該僅爲ajax請求創建單獨的端點。最好擴展Output類來提供請求格式的響應。這樣更加RESTful。

對於可以處理它的瀏覽器利用HTML5 History API並回退到其他人的onhashchange事件也是一種很好的做法。

一些更多的指針:

使用 「#!」來表示ajax觸發的內容更改,而不僅僅是一個「#」。您可能在某些時候想要使用片段提供的默認錨定功能(但感嘆號是「安全」的,因爲您可能不會有以該特定字符開頭的元素ID)。

我還建議使用絕對URI(即#!/ USA/NY/Albany),因爲它更容易在ajax部分加載機制中保持一致。

此外,如果有人用URL中的ajaxed-fragment重新加載頁面,如果你不只是做一個window.location.href ='...'來加載新鮮的頁面,它會變得非常混亂。在那個時候你會遇到各種各樣的問題。