携帯ブラウザにカスタムエラーページを表示させるには?

WebサーバーがHTTPエラーを返すと、一部の携帯ブラウザではエラーダイアログが表示される。このため、エラーページをカスタマイズしても、そのエラーページの内容を表示させることができない。時にはカスタマイズしたエラーページをどうしても表示させたい、という要求もあったりする。果たしてどうやればHTTPエラーページを全携帯ブラウザに表示させられるのだろうか?

IMGP0309-ss

 

HTTPステータスコードとエラーページ

Webサーバー側で何かしらのエラーが発生すると、Webサーバーはステータスコードと共にエラーページを返す。ステータスコードなら500(Internal Server Error)とか404(Page Not Found)とかがお馴染みだ。そしてエラーページの内容はWebサーバーが提供する標準エラーページを利用することもできるし、サイトの内容に応じたページを自分でカスタマイズすることもできる。

一方、ブラウザ側ではステータスコードが404や500のレスポンスを受け取った場合、エラーページが含まれていればその内容を表示する。が、この挙動に機種依存があるのだ。

3キャリアでアクセスすると・・・

まずはdocomo・SoftBank・auで、HTTPエラーの発生するページへアクセスしてみた。サーバー側のApacheでは、「サーバーエラーが発生しました・・・」というメッセージが表示されるようにエラーページをカスタマイズしている。

IMGP0419-ss

※左からdocomo N-06A、au W61K、SoftBank 920P

ご覧のようにdocomoとSoftBankでは、サーバー側で設定したエラーページが表示されているが、auではエラーページが表示されない。ステータスコードが500となった場合、auではエラーページの代わりに「このページはエラーにより表示できません(500)」というダイアログを表示してしまう。

そもそもエラーダイアログじゃ駄目??

サイトにアクセスしているユーザーから見てみると、カスタムエラーページが表示されている場合でも、エラーダイアログが表示されている場合でも行動は同じ。どっちにしろエラーと分かるから、再アクセスにチャレンジしたり、しばらく経ってからアクセスする。そういう意味では、エラーダイアログに対して対処しないという判断も悪くはない。

が、どうしてもカスタムエラーページを表示したい、というケースも時々ある。サイト運営側の事情で、ブラウザに表示される文言に敏感な場合だ。「エラーにより表示できません」というダイアログではなく「サイトへのアクセスが集中しています」のような文言を表示できないか、とクライアントから要望されたのなら、エラーダイアログを表示させない方法を考えることになるだろう。

ステータスコード400番台・500番台は諦めざるを得ない!

auだと、ステータスコードが400番台や500番台のときにエラーダイアログを表示してしまう。なので、エラーダイアログを表示させないようにするには、正常系のステータスコードを使用するしか方法がない。

が、ここで注意。一般的にエラー発生時に正常系のステータスを使用する、というのは好ましくないはずだ。例を挙げるなら、nagiosとかでURL監視を行っていると、監視システム側でサーバーエラーを検出できない。Webサイトのクローラーからの接続を考えたときも、エラーページがインデックス化されそうでちょっと心配。外部システムとの連携には注意が必要そうだ。

以上を踏まえた上で、Apacheレベルでの解決策を紹介する。

解決策その1:エラーページへリダイレクトする

一番簡単な解決策は、サーバーエラーが発生した際、HTTPエラーを返すのではなく、エラーページのURLへリダイレクトするという方法。Apacheの設定を次のように変更する。

ErrorDocument 500 http://xxx.xxx.xxx/error/500.html

ポイントはErrorDocumentディレクティブの第2引数に絶対URLを指定するという点。エラーページとして絶対URLを指定すると、Apacheはサーバーエラーが発生したときに指定したURLへリダイレクトさせる。エラーページへ直接HTTPリクエストが行われると、ステータスコードは200(OK)となるため、全キャリアで表示が可能となる。

 IMGP0413-ss

解決策その2:エラーページのステータスコードを200に変更する

auでエラーページが表示できないのは、ステータスコードが500だから。それならエラーページのステータスコードを200(OK)にしてしまおう、というのがこの方法だ。とは言っても、Apacheだとステータスコード自体を変更することは難しそう。なので、エラーが発生したときにスクリプトを呼び出し、スクリプトコード内で明示的にステータスコードを設定するようにする。

例としてCGIを利用する場合は、次のようになる。

ErrorDocument 500 /cgi-bin/500.cgi

CGIでは明示的にステータスコードをセットした上で、通常ページと同様にHTTPレスポンスを返却する。

#!/usr/bin/perl
print "Status: 200 OKn";
print "Content-Type: text/html; charset=Shift_JISnn";
print <<__BOUNDARY_HTMLBODY__;
<html>
<head>
<title>アクセス集中</title>
<meta http-equiv="cache-control" content="no-cache" />
</head>
<body>
ただ今、サイトへのアクセスが集中しています。恐れ入りますが、しばらく立ってからもう一度アクセスをお願いします。
<hr>
<a href="/">TOPへ</a>
</body>
</html>
__BOUNDARY_HTMLBODY__

まとめ

今回はちょっとした設定変更で、カスタムエラーページを3キャリアに表示させる方法を紹介した。

そう言えば、カスタムエラーページが表示できないのはIEも同じ。でもIEの場合は、カスタムエラーページのサイズが512バイト未満の場合だけ表示できないだけで、ファイルサイズが512バイト以上になるようにすれば、表示が可能。ひょっとして・・・と思ってauでもやってみたけど、ファイルサイズには関係なくエラーダイアログとなってしまいました。

Page Top