Да, Google написал некоторые хорошие вещи на эту тему, в частности, поддержание АЯКС состояния приложения с идентификаторами фрагментов: 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, а затем отобразить только частичные результаты вас п чтобы заполнить ваши внешние изменения.
2) В противном случае предположим, что это либо поисковая система, либо прямая загрузка страницы. Отображение полностью построенной страницы.
Вы не должны создавать отдельные конечные точки только для запросов ajax. Вероятно, лучше расширить класс Output, чтобы обеспечить ответ в запрошенном формате. Это скорее RESTful.
Также неплохо использовать API истории HTML5 для браузеров, которые могут его обрабатывать, и вернуться к событию onhashchange для других.
еще несколько указателей:
Использование "#!" для указания изменений, вызванных ajax-событиями, а не просто «#». В какой-то момент вы можете использовать функциональные возможности привязки по умолчанию, которые предоставляет фрагмент (но восклицательный знак «безопасен», поскольку у вас, вероятно, не будет идентификаторов элементов, начиная с этого конкретного символа).
Я бы также рекомендовал использовать абсолютный URI (например, #!/USA/NY/Albany), так как будет легче оставаться последовательным в вашем механизме частичной загрузки ajax.
Кроме того, если кто-то перезагружает страницу с помощью ajaxed-фрагмента в URL-адресе, он может стать довольно грязным, если вы не просто сделаете window.location.href = '...', чтобы загрузить страницу свежей. В этот момент вы столкнетесь со всеми проблемами.