文系プログラマによるTIPSブログ

文系プログラマ脳の私が開発現場で学んだ事やプログラミングのTIPSをまとめています。

javaでソフト404エラーに対応する

最近Googleウェブマスターツールに出現した「ソフト404」についての話題。
ウェブマスターツールのクロールエラーの部分に、最近「ソフト404」という見慣れないものが追加されています。
これは、
ページは存在するが、表示するコンテンツが存在しない。
HTTPステータスコードは404ではなく200、つまり正常である。
という状態のことを意味しています。

例えば、googleで検索してtree-shopの商品検索結果画面に遷移するとします。
その時すでにその商品が無く、検索結果が0件だったとします。
ずばりこういう状況のことを指しています。

では何が問題なのでしょう。

存在しないページに対して 404 と 410 以外のコードを返すこと(または 404 を返す代わりにホームページなど他のページにリダイレクトすること)は、問題となる可能性があります。まず、その URL にページが存在することが検索エンジンに明示されます。その結果、URL がクロールされ、コンテンツがインデックスに登録される場合があります。存在しないページに対して Googlebot の時間が消費されるため、所有している固有の URL の検出が遅れたり、アクセスの頻度が少なくなったりする可能性があります。また、サイトのクロール範囲にも影響する可能性があります(検索クエリ「ファイルが見つかりません」でサイトが上位にランクされることは避ける必要があります)。

http://support.google.com/webmasters/bin/answer.py?hl=ja&answer=181708

ということです。要点だけまとめると、

  • 実質404ページだから、ユーザにとっては不要なページなんだから、http404返してインデックスから削除しろ(クロールによるリソース消費も減るし)
  • 404として返せばインデックスが削除される。つまり404ページをクロールする分を他のページに回せる。(更新間もないページのインデックスの高速化)

でしょうか。
最近のgoogleパンダアップデートで、古いコンテンツは順位が下がる(検索結果の先頭に表示され難くなる)事が解っているので、
余計にソフト404対策が重要なものとなるでしょう。

Javahttpステータスコード404を設定する場合、こんな感じのコードになります。

response.setStatus(HttpServletResponse.SC_NOT_FOUND);

response.sendError(HttpServletResponse.SC_NOT_FOUND);
ってやってしまうと以下のエラーが出るので、setStatusを使いましょう。

java.lang.IllegalStateException: レスポンスをコミットした後でフォワードできません

これでhttpステータスコード404が設定できました。
あとは実際に該当画面を表示してみて、Firebugのコンソールで

"NetworkError: 404 Not Found - http://localhost/yahoo/item/search/13457/?query=%E5%AD%98%E5%9C%A8%E3%81%97%E3%81%AA%E3%81%84URL%E3%81%A7%E3%81%99%E3%82%88&page=1&viewMode=1"

こんな感じで表示されればOKです。