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