是,谷歌寫了關於這個問題的一些好東西,特別是保持與片段標識符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 ='...'來加載新鮮的頁面,它會變得非常混亂。在那個時候你會遇到各種各樣的問題。