ステータス200なのに「その商品はありません」

ウェブマスターのための Google 情報という一連のページは目を通したほうがいい。一見当たり前のような記述が実は重要な示唆だったりする。 その一節を紹介しよう。

削除のリクエストは、ページの http ヘッダーが 404 エラーを返した場合のみ承認されます。 従来の 404 エラーではなくユーザーにわかりやすいページを構成された場合でも、http ヘッダーで 404 エラーを返すようにしてください。 "File Not Found" というページが表示される場合でも、http ヘッダーが 200 または異常なしのステータス コードを返している場合、削除のリクエストは承認されません。
ウェブマスターのための Google 情報 - 削除 より
エンジニア以外の人間が読むと、「ページがなければ404エラー。そんなのあたりまえだろ。」で終わってしまいかねない。 ここでは、「404エラーページを見せろ」ではなく「httpヘッダーで404を返せ」と言っているのがミソだ。

とりあえず、IEならieHTTPHeaders、Firefoxならlivehttpheadersをインストールしよう。準備ができたら、自分の思いつくECサイトへ行って、適当な商品をクリックする。 まともに存在する商品のページであれば、「HTTP/1.1 200 OK」のようなHTTPヘッダが返されているのを確認することができるだろう。

では、そのページのURLをちょっといじってみよう。たいていのECサイトであれば商品番号らしきものがURLに埋め込まれているはずだ。そこの英数字をとにかく滅茶苦茶な値にしてみる。どうなるだろうか?「その商品はありません」みたいなエラーメッセージが表示される。そりゃそうだ。でもHTTPヘッダはどうだろう?「200 OK」 あれれ?HTTPでは表示されるべきものがない場合には「404 Not Found」というHTTPヘッダが返される(べき)ではなかったのか?

一方、Yahooやamazonなどよくお手本とされる老舗サイトでは、404を返すべきときにきちんと404を返している。 (いずれも2006/3現在)

「一般ユーザーが見てわかるようなエラーメッセージを返してるんだからいいじゃん」と言ってしまえば確かにそれだけのことである。普通のユーザーにとってはこんな問題は重箱の隅だ。 しかし、検索エンジンやその他のクローラー相手だとそうはいかない。 自動化されたプログラムにとってhttpヘッダの情報は今もこれからも重要な手がかりだ。

上の例ではユニーク値を強引にめちゃくちゃにいじった結果だが、 何もそこまでしなくても、商品の販売終了や掲載記事の削除によって、その商品番号なり記事番号なりが無効化されることはよくあることだ。 しかし、それらのページへのアクセスが過去に200 OKを返したことがあり、かつ今も200 OKを返し続けている場合には、次のような結果を招く。

ページが表示できません site:item.rakuten.co.jp - Google 検索
↑1万5000件ヒット(2006/3現在)。楽天のサーバ上でかつてあった商品の残骸が検索エンジンのインデクスに残ってしまっているの図。これらのページがもしもちゃんと404を返すようになっていればこんなに沢山は残らないはず。
検索エンジンの 「site:ホスト名」による検索で、「やった!我が社のサイトは○万件もインデクスされてるぞ!」と喜んでいるその数字には、 本来なら404エラーとなってインデックスから削除されるべきページが相当数含まれているのかもしれない。 心当たりのある人は確認したほうがいいだろう。

オリジナルのWebアプリでも出来合いのWebアプリでも企業が構築した高度なWebサイトであっても、データ層(DBとか)からの取得結果がゼロ件なら「その商品/記事はありません」を表示する、といった仕様は当たり前のように実装されている。 しかし、HTTPステータスコードまできちんと考慮されているケースは実は驚くほど少ない。

404エラーページをカスタマイズして、せめて「トップに戻る」リンクを張っておく、とか、 そもそも404エラーを見せることが無いようにメンテしよう、といった方針や仕様だけで満足してしまっているのだろう。

「ステータスコードをいじるのは難しい」といった言い訳をするエンジニアもいるが、それはうそだ。 java/jspであれば
response.setError(404, "Not Found")
PHPであれば
header("Not Found", true, 404)
他の言語も似たようなもの。まったく難しくは無い。

Webの世界では、良くも悪くもHTTPプロトコルに従わなければならない。 それをちょっとでも無視すると、思わぬところで障害にでくわすことになる。

see also:

トラックバックURL

このエントリーのトラックバックURL:
http://www.ywcafe.net/mt/mt-tb.cgi/540

トラックバック

» 200 Blog Not Found from 404 Blog Not Found
以外に忘れられがちなのが、これ。 ステータス200なのに「その商品はありません」エンジニア以外の人間が読むと、「ページがなければ404エラー。そんなのあたりま... 続きを読む

» ネタ from NE(ねとわーくえんぎにあ)日記
ステータス200なのに「その商品はありません」 HTTPヘッダはhttpdの仕事。アプリケーションで偽装させるのはよくないと思うんだけど。 これはhttpdの実... 続きを読む

» osCommerce Hack:商品が見つからない時にHTTPコード404を返す from authenticblog
ショップ上に商品が見つからない場合、osCommerceでは標準で「商品が見つかりません...」という文言を表示する仕組みが備わっています。 ただし、この... 続きを読む

» del.icio.us API の Error response について from The Croton
del.icio.us API は request URL (正確にはアドレスの... 続きを読む

コメント

実は2001年2月時点のYahoo! Japanでは、404のところが200 OKって返ってきてました。リンクチェックプログラムをつくっていた時に気づいて頭をかかえた記憶があります。

私の書き込みですが...
http://mtlab.ecn.fpu.ac.jp/WSM_2001/010210020406.html

そんなに単純な話ではないのでは?
404や200は、あくまでHTTPレイヤーのステータスコードです。「商品がない」のと「ページがない」のとは違いますよね? アプリケーションレイヤーと下位のHTTPレイヤーという、階層構造になっているからです。
Wikiなんかでも、存在しないページにアクセスすると、200を返しつつ、編集画面が開きます。404を返しつつ編集画面を表示するのはおかしいわけです。同様に、Webアプリケーションで「商品がない」のと「ページがない」のを分けるという考え方も、ある面で合理的といえます。
たしかに、普通のユーザーにとっては分かりにくい面もありますが、エンジニアリング的には正しいアプローチではないでしょうか? また、「商品がない」場合に404を期待する検索エンジンがもしあるとすれば、それはそれでおかしいです。
本当にやるべきことは、「存在しない商品にできるだけリンクが貼られないような、URL設計をすべき」ということじゃないでしょうか? 商品が売り切れてしまった場合は、「売り切れました」とか、「絶版になりました」と表示するともっと良いでしょう。

>>ふじさわさん

消費者からみれば、検索結果に引っかかったページへのリンクをクリックしたら「売り切れました」と表示されるより、最初っから検索に引っかからないほうがいいわけですよね?
「商品がない」のなら「ページがない」状態にしておいたほうがいいって話だと思います。

> とおりすがりの倉庫キャラさん
たしかに。コメントを書いてから思い付いたのですが(それで自分のサイトに書いたのですが)、もう一歩進めて、「似たような商品でこんなのがありますよ」と表示したらどうでしょう? そのほうが、消費者も販売側もハッピーになる気がします。
あるいは「売り切れ」、「絶版」と書くだけでも消費者に価値がありますよね? ページがないのでは、なぜないのか、どうすれば手に入れられるか、ヒントすら与えられないですから。
「最初っから検索に引っかからないほうがいい」というのは一理ありますけど、希少品などは「その店でかつて取り扱っていた」という情報があるだけでも役立つことがあります。どっちがいいかは、なかなか難しそうですけど、もうちょっと検討の余地があるんじゃないでしょうか?

筆者のかたは、
「商品がない」は「404」にすべき。
と言っているわけではないですよね。

人間には「えらー」とか「ページがありません」しか見せていないのに、
機械には「200」と返している矛盾が問題だと行っているのだと思います。

売り切れにしてもまた入荷するとか、
絶版になった商品の情報を求めている人だっているだろうし。

だだのエラーしか表示しないのであれば、
404の方がいい(検索されない)と思うし、
何らかの情報があるなら200でしょう。

逆に言うと、200を返すなら(検索にヒットさせるなら)
「売り切れました」だけじゃなく
商品の仕様や写真など、
何らかの情報を残しておいてほしいなぁ。
(いち消費者のお願いです)

> とおりすがりの倉庫キャラさん
「似たような商品がありますよ」って言うのはすばらしいですね。

コメントする

(初めてのコメントの時は、コメントが表示されるためにこのブログのオーナーの承認が必要になることがあります。承認されるまでコメントは表示されませんのでしばらくお待ちください)


画像の中に見える文字を入力してください。