PHPのページにX-Robots-Tagでnoindexを設定し検索結果に出ないようにする方法

[対象: 上級]

今日の記事は、自分へのメモを兼ねたやや難し目の技術的なトピックになります。

X-Robots-Tag の noindex と nofollow をPHPを用いてHTTPヘッダーのなかに出力させる設定方法です。

次のコードを記述します。

header("X-Robots-Tag: noindex, nofollow")

使う場面はかなり限られているはずで普通は使わないと思います。

僕は、ブログのサイドバーに広告を設置しています。

広告リンクなのでGoogleのガイドラインに従ってPageRankを渡さないようにrobots.txtでブロックした中間ページを挟んでリダイレクトしています。

ところがこの中間ページが検索結果に出てきてしまうことがあります(ちなみに今はrobots.txtでブロックされているというメッセージがスニペット代わりとして出る)。

検索結果に出てきたrobots.txtでブロックしたページ

robots.txtはクロールを拒否するものであって検索結果への表示を禁止するものではないからですね。

それならばnoindex robots metaタグを中間ページに記述すればいいように考えるかもしれません。
しかし中間ページはrobots.txtでブロックされているのでGooglebotは中身を見ることができません。

そこでX-Robots-Tagを利用してHTTPヘッダーでnoindex(とnofollow)を返すようにしたのです。

Fetch as Googleで検証すると正しく出力できています。

Fetch as Googleで検証したX-Robots-Tag

注意点が2つあります。

まず、リダイレクトは301を使います。
302リダイレクトは転送元のURLを残すのでやはり検索結果に出てきてしまうことがあります。

次に、中間ページはrobots.txtから外します。
robots.txtでブロックしてしまうとアクセス(クロール)しなくなるのでHTTPヘッダーを返してもらえません。

ブロックすると結局、noindexの存在に気付いてもらえないので検索結果に出てくるでしょう。
アクセスさせたうえでnoindexを認識させ検索結果から非表示にさせなければなりません。

最終的には次のPHPコードになります。

<?
Header("HTTP/1.1 301 Moved Permanently");
header("X-Robots-Tag: noindex, nofollow");
Header("Location: リダイレクト先のURL");
?>

PageRankを渡さないようにnofollowも併せて記述しました(たぶんこれでいいと思うけど確信が持てないのでaタグのリンクにrel=”nofollow”も付けています)。

何らかの事情があって内部リンクで繋げた中間ページを介して外部のサイトに飛ばす場合(たとえばアフィリエイトリンクを隠す場合)で、その中間ページを検索結果に出したくないときにはPHPが使える環境であれば、今日紹介したX-Robots-TagでnoindexをHTTPヘッダーに出力する方法が利用できます。

なお.htaccessでのX-Robots-Tagの設定方法は以前に解説しているので興味のある方はそちらも確認してください。

最後に余談です。

広告リンク用の中間ページが検索結果に出ていても害はないのですがなんとなく気持ち悪いので僕は消したかったのです。

PageRankを渡さないようにするにはrel=”nofollow”を付けるのがいちばん簡単ですがrobots.txtで弾いた中間ページを最初に使っていたのでその名残りです。w

ただrel=”nofollow”のリンクは、PageRankやアンカーテキストこそリンク先ページに渡しませんがURLの発見には使われることがあります。
なので検索結果にやっぱり出てきてしまうことがあります。

あと、X-Robots-TagはBingもサポートしています。

【参照】