Ajax利用時のインデックス制御について

たま~に、Search ConsoleからクロールエラーでAPI(外部サイトに公開している)として利用しているものがエラーで検出されていたんですが、ここまで見てくれるのか~!あざっすって思って感謝していますた。

ふと考えてみると、クローラーが認識しているという事はインデックスもされてるんじゃないか?という疑問が出て site コマンドでインデックス状況を見てみると・・・AjaxでリクエストしているURLが見事にインデックスされていました(; ・`д・´)

Ajaxで取得しているページが数千件ほどインデックスされてしまっている状況・・・orz

Ajaxで取得している内容はオリジナルページの一部情報を取得してリクエスト元サイトに内容を埋め込むものになっています。その結果、リクエスト元ページから自分のサイトへのリンクが張られて誘導されるというものになっていました。

※一部情報とは、リクエスト元サイトに挿入する作りで作っているため、headerタグとかbodyタグ無しのhtmlコードを返すものとなっています。

このオリジナルページの一部情報だけが表示されるAjaxのリクエストが直リンクでも開くため、クローラーがインデックスしまっている?状況なのかな。※クローラーはリンクをたどるわけではなくてリファラーは無しで直リンクで飛んでくる。

一部しか情報が無いため検索結果でAPIの結果ページから流入してきたユーザーに対してのユーザビリティーがかなり悪いし、Ajaxで表示している内容はオリジナルページの一部のため、そのページはインデックスする必要が無くてむしろオリジナルページの方を見てもらいたい!!

よって、対策を考えること。

検討した内容は下記になります。

 

1.robots.txt で disallow でブロックしてしまう。

クローラーにクロールさせるのブロックする方法を行うと、既にインデックスされているページに対してもクロールが出来なくなってしまい、インデックスが残ってしまう可能性があるため却下。出来ればリンクも辿って欲しい!!

2.API結果の発リンクに nofollow を設定する。

nofollow を指定するとクロール自体がされなくなるだけなので、インデックスが消えるわけじゃないため却下。またクローラーにはリンクを認識してほしいので nofollow は設定しない。

noindexはページランクを渡すため。下記参照。

noindexとは? SEOでの効果的な使い方を理解しよう!

3.noindex でインデックさせないようにしてしまう。

クローラーにはリンクを認識してもらいつつインデックスを消すことが出来るため、こちらを候補として採用(゚∀゚)キタコレ!!

ただし、単純にレスポンス結果に noindex タグを入れてしまうと、リクエスト元サイトに挿入されるため、Ajaxのレスポンス結果が noindex されるわけではなくてリクエスト元ページが noindex の対象になってしまうかも!?(((((((( ;゚Д゚))))))))ガクガクブルブルガタガタブルブル

これが出来たらコワいな・・・w

と思っていたら、noindex は header 以外でも有効らしい。下記ブログにも書かれていますが、悪意あるユーザーがコメントとかで noindex を利用したら消されちゃうってことかっ!?エッ(゚Д゚≡゚Д゚)マジ?

アブネ━━━━Σ(゚д゚;)━━━━!!

https://lblevery.com/sfn/attract/seo/internal-seo/noindex/

4.canonical で正規化する。

オリジナルページへURLを正規化することで間違ったインデックスを正しくできるため、こちらも候補として採用(゚∀゚)キタコレ!!

ただ、canonical は header タグの中でしか認識されないため、今回のAjax通信のレスポンスとしてHTMLで返すことは出来ない。やる場合にはHTTPヘッダーとして返してあげる必要がある。

Googleがrel=”canonical”タグを無視する時とGoogleにrel=”canonical”タグを確実に認識させる方法


とりあえず深く考えず試したのが noindex の方法になります。

noindex の設定方法について

noindex の設定方法はいくつかあります。

1.meta タグで指定する。

対象ページに下記を記述するだけ!

<meta name=”robots” content=”noindex”>

ページ単位で指定する必要がある。

2.robots.txt で指定する。

robots.txt に下記のように記述する

Noindex: /test/

ディレクトリ単位で指定ができる。

3.HTTP ヘッダーで指定する。

レスポンスとして下記を出力して返す。

X-Robots-Tag: noindex

ページ単位で指定する必要がある。

詳細はヘルプを確認してくらはい!


今回は、URLで大きく分けられていたので方法2の「robots.txtで指定する」方法でディレクトリ単位での設定を利用してみました。

設定する前にsiteコマンドで確認したインデックス数は約8000件でした。

数日後、対象サイトのSearch Consoleを見ていると、ブロックされたリソースが大量に増えてることに気づく・・・(; ・`д・´) ナ、ナンダッテー!! (`・д´・ ;)

ブロックされたリソースを見ると、数日前に設定したAPI関係のURLが対象になっている・・・(;´・ω・)

あれ、noindexって、クロールは許可してインデックスだけしないって感じじゃないんだっけ?(´ヘ`;)ウーム…

ブロックもしちゃう?それなら disallow と変わらないじゃん・・・(;´・ω・)

念のため Fetch as Google でクローラーが認識している画面を確認すると、見事にAPIの部分が表示されていませんでした・・・。下部のブロックされたリソースにもAjax部分が書かれていました。Σ(゚◇゚;)マジデッ!?

これは意図した動きではない!こんなのは望んでない!!バカーヾ(゚д゚)ノ゛

ちなみにインデックスされていた件数は減少していました。一応インデックスの方は削除されて言ってる模様です。

※設定する前にsiteコマンドで確認したインデックス数は約8000件だったのが7件になっていた。

noindex時の指定方法が違う場合の Fetch as Google の挙動検証

念のため、meta タグに設定されているものと、robots.txt で指定してる場合の挙動を確認。

検証用ファイルとして下記を用意。

・robots.txt でdisallow を指定した場合に表示させるhtml

disallow.html

<html>
<head>
</head>
<body>
disallow
</body>
</html>

・メタタグでnoindexを指定した場合に表示させるhtml

noindex.html

<html>
<head>
<meta name="robots" content="noindex">
</head>
<body>
noindex
</body>
</html>

・robots.txtでnoindexを指定した場合に表示させるhtml

noindex-robots.html

<html>
<head>
</head>
<body>
noindex robots
</body>
</html>

・httpヘッダーでnoindexを指定した場合

noindex-header.php

<?php

$html = <<< EOF
<html>
<head>
</head>
<body>
noindex http header
</body>
</html>
EOF;

header("Content-type: text/html; charset=utf-8"); 
header("X-Robots-Tag: noindex");
echo($html);

robots.txt

User-Agent: *
Disallow: /disallow.html
Noindex: /noindex-robots.html

上記ファイルを元に再度 Fetch as Google を実行してみた結果、下記の結果になりますた。

・disallow.html

ブロック扱いで、レンダリングもされない。(クロールされない)

・noindex.html

ブロックされずにレンダリングされる。(クロールされる)

・noindex-robots.html

ブロック扱いで、レンダリングもされない。(クロールされない)

・noindex-header.php

ブロックされずにレンダリングされる。(クロールされる)

うーむ、やっぱり robots.txt で指定した noindex の場合にははクロールすらされなくなるってことですかね・・・orz

指定方法で挙動が違うって問題ないの!?( ´゚д゚)(゚д゚` )ネー

 

どうしようかな~?って考えてたら・・・そういえば元々オリジナルページに一部の情報を使ってるんだから canonical で良いんじゃない?って思いつきますた( ̄ー ̄)ニヤリ

ただ canonical は meta 以外では使えないので AjaxのHTTPヘッダーで canonical を指定して返すことに!!

phpであれば下記のように出力すればOKъ(゚Д゚)グッジョブ!!

header("Link: <https://example.com/>; rel="canonical");

色々悩んだけど、今のところはこれで検証中です。

経過報告

siteコマンドで確認できる件数では数が増えているのですが、search console上のブロックされたリソースの数は減少傾向になってきましたキタ――(゚∀゚)――!!

減少し始めて日付がcanonicalを設定した日付付近なので今回の設定内容が影響を与えてるようです。

2017/10/09時点

まとめ

noindex の指定方法が違うとクローラーの挙動が違うので気を付ける。

robots.txtで指定したものはクロール自体をブロックされてしまうっぽい。クローラーがリンクを辿れない状況になる。

これで良いのかな~?って感じだけど、とりあえずAPI用のURLがインデックスから消えることと、APIを利用してくれてるサイトでAPIの部分で挿入されたHTMLがクローラーにちゃんと認識してくれるのであれば(・∀・)イイ!!

ベストプラクティスがあればどなたか教えてクレメンス!|д゚)チラッ

https://developers.google.com/webmasters/ajax-crawling/docs/learn-more

https://developers.google.com/webmasters/ajax-crawling/docs/faq?hl=ja#excludesomeurls

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です