携帯ブラウザにカスタムエラーページを表示させるには?
- 2009.10.09
- ガラケー
WebサーバーがHTTPエラーを返すと、一部の携帯ブラウザではエラーダイアログが表示される。このため、エラーページをカスタマイズしても、そのエラーページの内容を表示させることができない。時にはカスタマイズしたエラーページをどうしても表示させたい、という要求もあったりする。果たしてどうやればHTTPエラーページを全携帯ブラウザに表示させられるのだろうか?
HTTPステータスコードとエラーページ
Webサーバー側で何かしらのエラーが発生すると、Webサーバーはステータスコードと共にエラーページを返す。ステータスコードなら500(Internal Server Error)とか404(Page Not Found)とかがお馴染みだ。そしてエラーページの内容はWebサーバーが提供する標準エラーページを利用することもできるし、サイトの内容に応じたページを自分でカスタマイズすることもできる。
一方、ブラウザ側ではステータスコードが404や500のレスポンスを受け取った場合、エラーページが含まれていればその内容を表示する。が、この挙動に機種依存があるのだ。
3キャリアでアクセスすると・・・
まずはdocomo・SoftBank・auで、HTTPエラーの発生するページへアクセスしてみた。サーバー側のApacheでは、「サーバーエラーが発生しました・・・」というメッセージが表示されるようにエラーページをカスタマイズしている。
※左から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)となるため、全キャリアで表示が可能となる。
解決策その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でもやってみたけど、ファイルサイズには関係なくエラーダイアログとなってしまいました。