はい、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 クラスを拡張することをお勧めします。その方がRESTfulです。
HTML5 History API を処理できるブラウザーには HTML5 History API を活用し、その他のブラウザーには onhashchange イベントにフォールバックすることもお勧めします。
さらにいくつかのポインタ:
使用する "#!" 単なる「#」ではなく、ajax によってトリガーされたコンテンツの変更を示します。ある時点で、フラグメントが提供するデフォルトのアンカー機能を使用したい場合があります (ただし、その特定の文字で始まる要素 ID はおそらくないため、感嘆符は「安全」です)。
また、Ajax 部分読み込みメカニズムで一貫性を保つことが容易になるため、絶対 URI (つまり、#!/USA/NY/Albany) を使用することをお勧めします。
さらに、誰かが URL に ajaxed-fragment を含むページをリロードした場合、window.location.href = '...' を実行してページを新しくロードしないと、かなり面倒になる可能性があります。その時点で、戻る/進むに関するあらゆる種類の問題に遭遇します。