WEBサイトを運営していて、Ajaxページを作成した場合、そのページは、Ajaxの未適用の状態でGoogleにインデックスされることがあります。
しかし、サイト運営者としては、Ajaxを適用した状態でインデックスして欲しい場合もあります。
そこで、GoogleにAjaxページをインデックスしてもらう方法について覚書しておきます。(お約束ですが、以下の方法の採用は自己責任でお願いします。)
まずは、Googleの公式ページをよく読む必要があります。あまり難しくはないので必読です。
【AJAX クロール: ウェブマスターおよびデベロッパー向けガイド】
https://support.google.com/webmasters/answer/174992
上記ページでは、主に2つの方法が述べられていますが、ここでは、3.の「ハッシュ フラグメントを使用せずに処理する」を採用します。
まずは、コンテンツとなるページに、次のmetaタグを含ませます。
<meta name="fragment" content="!">
次に、URLをフラグメントに対応するようにします。
www.example.com?_escaped_fragment_=
?以降がAjaxページであることのパラメーターとなります。
そして、?_escaped_fragment_=がある場合には、PHPなどで、Ajax適用状態のページをレスポンスとして返すようにします。
ここまでは、とても簡単です。
ここで問題となるのが、動的にURLを構成するページではどうするかです。
たとえば、一見、次のURLは、静的に見えます。
www.example.com
/foo/bar
しかし、実際は、次のように動的にURLを処理している場合もあるでしょう。
www.example.com?category=
foo&page=bar
こうした場合には、mod_rewrite などを使って処理しているはずなので、「?_escaped_fragment_=」についても動的に処理します。
.htaccess に次のように記述します。最後の2行は実質1行です。
RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{QUERY_STRING} ^_escaped_fragment_=$ RewriteRule ^([a-z]{10})/([a-z]{10})$ page.php?category=$1&page=$2&_escaped_fragment_= [L]
上記の.htaccessの肝は、次の条件文です。クエリに、「_escaped_fragment_=」を含む場合のみRewriteRuleを実行します。
RewriteCond %{QUERY_STRING} ^_escaped_fragment_=$
そして、次行で実行するRewriteRuleでは、&_escaped_fragment_= を末尾に付けるようにします。
なお、RewriteRule については、ご自身のサイト構成にあわせて適切に変更してください。
これで、「きれいな URL を対応する汚い URL に一時的にマッピングします」ということを、mod_rewriteを使って動的に処理することができるようになります。
(注意点)
1.mod_rewriteの条件文(RewriteCond)は、続く1行にのみ作用します。そのため、その後の行には影響しません。
2.RewriteRuleのみを使って処理できるようにも思えますが、RewriteRuleは、?以降のパラメーターを無視するため、RewriteCondで条件を判定しないと処理ができません。
今回は、この2番でつまづいて、大変でしたが、何とか作業が終了しました。
【追記】
一応、上記の設定をした後には、サイトのアクセスログを分析してロボットがAjaxページをきちんと取得したかを確認した方が良いと思います。
ちなみに、自分の場合には、設定後、数時間ほどで、botがきて、
「?_escaped_fragment_=」付きのページを取得していきました。
下は、そのときのログの一部です。(一部伏字及び改変)
**.249.77.** – – [14/Dec/2013:19:17:48 +0900] “GET /abc/xyz?_escaped_fragment_= HTTP/1.1″ 200 3117 “-” “Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)”
なお、googlebot以外に、Bingのボットも確認できました。
以上です。