ページは見つかったのか。見つかっていないのか。

Webサービスを利用する際に頻繁に目にすることがある、”404 Not Found”という画面があります。

実際にはエラー表示専用の画面をデザインすることが多いため、メッセージの見栄えはサイトによって異なることが多いです。例えば、弊社コーポレートサイトのエラー画面は、以下のようになっています。

ZYYX 404

このページ内容は、Webサイトのコンテンツにアクセスした際に、URLで指定されたコンテンツが物理的に存在しない場合にWebサーバーが返すものです。コンテンツが存在し、正常にレスポンスされる場合には、”200 OK”が返されます。

このエラーが発生した際、Webサーバーのアクセスログには、HTTPステータス404が発生した旨のログが記録され、エラーページのHTMLにGoogle Analytics等のWebビーコン型のタグを入れておけば、そちら側のログにもHTTPステータス404が記録されます。

さて、HTTPステータスに関しての前置きが長くなってしまいましたが、ここから本題です。

WebCenter Sites(以下、WCS)で動的配信を行う場合、表示されるページは、URLアクセス時に指定されたパラメーターや日付等の検索条件によって変化します。

例えば、コーポレートサイトにニュースを掲載する場合を考えてみましょう。データの運用は、標準的には以下のようになると思います。

  1.  掲載したいニュースの原稿や画像素材を準備する。
  2. ニュースの原稿や素材をWCSのアセットに登録し、公開開始日時を指定する。
  3. WCSの未来日プレビュー機能を使用し、指定した日時にニュースが公開されることを確認する。
  4. ニュースのアセットを配信環境へパブリッシュし、公開開始日時を待つ。

その後、パブリッシュしたニュースの公開開始日時を過ぎると、ビジター画面にニュースが表示され、Google等の検索エンジンのクローラーのアクセスがあり、インターネット上の検索サイトで公開したニュースが検索できるようになります。

さて、ニュース公開後、例えばニュースの公開開始日時を間違って早めに設定してしまった場合のことを考えてみます。公開してしまったニュースを取り下げるには、以下のような方法があると思います。

  •  公開開始日時を修正したアセットをパブリッシュしなおす。
  • ニュースのアセットに非表示にするためのフラグがあれば、それを設定してパブリッシュしなおす。
  • ニュースのアセット自体を削除する。

上記いずれの対象方法を行っても、配信環境では「表示対象のニュースが存在しない」とテンプレートのロジックで判断され、該当のニュースは表示されなくなります。

ここに落とし穴があります。

テンプレートの判断でアセットの有無を判断して出力する結果は、サーバー側の処理としては正常なものですので、見た目上「このページは存在しません」と表示したところで、HTTPのレスポンスとしては”200 OK”が戻ってしまうのです。(この動きを、「ソフト404」と呼びます)

ソフト404は、Webサイトを見ているのが人間だけならば問題はないのですが、実際には、以下の弊害を伴っています。

  • 一度検索エンジンのクローラーによって該当ニュースのページがインデックスされた場合、ソフト404で取り下げを行っても存在しないページの内容や、場合によっては、エラーメッセージを表示したページの内容が検索エンジンのインデックスに残ってしまい、検索の対象となってしまいます。検索にはヒットするのに、実際にリンクをクリックすると内容が無い、ということで、サイトにアクセスしてきたビジターの不信感につながってしまいます。
  • ソフト404を発生させた場合、アクセスログ(Webサーバーのログ、Google Analytics等のWebビーコン型のログのどちらにも)に存在しないページヘのアクセスが”200 OK”として記録されてしまうため、ログをベースにしたコンテンツ改善(リンク切れの解消や、ページアクセス解析)がやりにくくります。

表示させるページが存在しない場合に、ソフト404ではなく、「本当の404 Not Found」を発生させるにはどうすればいいのか。ここで、WCSの仕様が壁となって立ちはだかります。

なんと、WCSでは、標準でHTTPステータスの変更方法がないのです。

WCSのテンプレートはJSPベースですが、setStatus等でHTTPステータスを任意に変更することができません。(同じように、動的にContent-Typeの変更もできないのですが、それは別の機会に)

とはいえ、「いやー、WCSの仕様なので仕方ないんですよねー」で通じるような世の中でもありませんので、弊社はどう解決しているかというと、レスポンスを書き換える「サーブレット・フィルタ」を追加開発して、対処を行っています。

サーブレット・フィルタは、サーブレットを呼び出す前後でリクエストとレスポンスの値に対して処理を行うことができるプログラムです。実際の処理の詳細は本稿では割愛させていただきますが、簡単にいうと、テンプレート側でソフト404のレスポンスを返す際に、サーブレット・フィルタ側でHTTPステータスを”200 OK”から、”404 Not Found”に変更してブラウザやクローラーへ返すようにしています。これで、ソフト404にまつわる弊害も、完全に解決です。

蛇足になるかもしれませんが、このソフト404問題、設計・開発時に意外と見落とされがちでもあるので、本稿が何らかのヒントになることを期待しております。


新年のご挨拶

読者の皆様

新年あけましておめでとうございます。
本年もWebCenter Sites 開発者ブログと株式会社ジークスを、どうぞよろしくお願いいたします。

新年第一回目のブログは、1/17(金)に公開予定です。
どうぞ、お楽しみに。


WebCenter Sites コラム、始まります。

 ジークスでは、Oracle WebCenter SitesがまだFatWire Content Serverと呼ばれていた2006年から同製品を使用したWeb配信システムの構築に携わって参りました。

 構築した配信システムも、コーポレート・サイトからエンターテイメント・サイト、ECサイトやBtoBサイト、対象デバイスもPC向けだけでなく、携帯電話やスマートフォン向けサイト、他のアプリケーションへのデータ提供と、単なるWebサイト構築にとどまっていません。

 本コラムでは、これまで我々がWebCener Sitesサイトを構築して培ってきたシステム構築ノウハウや、その際の苦労をもとに、Oracle WebCenter Sitesという製品の特長や、システム構築のポイント等を様々な側面からお伝えしていきたいと思っています。

 今後の更新にご期待ください。