どうもこんにちは、最近梅がうめぇwさいほうへいきです。ところでMotchiyって誰ぞ。
今回はPHPを使って意外と簡単にへんなステータスコードを返していく方法についてまとめておきます。
Apacheでは変なステータスコードが使えないので、いろいろ遊び倒そうと思ってもなかなかできないで困っている人も……いるかも。
実は418もダメらしいんですよね。
そんな感じの対処法です。
経緯
僕はMotchiyくんのサーバーを借りてとあるWebサイトを運営しているんですが、そこの小ネタ兼いろいろ勉強で418 I'm a teapotを返そうと思っていたんですよね。
ところがApacheは418に対応してないらしく、普通にRewriteRule等では使えないみたいでした……。
一応、Apacheのソースコードを引っ張ってきて、書き直してから自分でビルドするといけるみたいなのですが、友人のサーバーを借りている都合上なかなかそんなことはできず。
というわけで、いろいろできないかと試行錯誤していました。
つかれたよ。
白状すると、手探りで色々やっている状態なのでもっと賢い解決方法があるかもしれません……。
418ってなにさ
ステータスコード418、4xx番台のエラーコードなのですが、言ってしまえばジョークです。
I'm a teapot、日本語に訳すると『私はティーポットです』。もうこの時点でおふざけ感ましましですね。こういうの大好き。
簡単に説明すると、コーヒーを淹れろと注文されても自分はティーポットなのでできませんよ、というエラー。
実はGoogleにも実装があります。かわいいので見てみてください。
で、こんな有名なコードがなぜApacheで使えないのか?
実は、公式には『予約済み』と置かれているだけで、I'm a teapotがキッチリ定義されているわけではないんです。
Apacheについて詳しく調べたことはないんですが、たぶんこのへんの事情が関係しているんじゃないかな……。
というわけで、RewriteRuleだのErrorDocumentだので418を書いてしまうと問答無用でインターナルエラーが起きます。ちくしょう!
結論
<?php
header("HTTP/1.1 418 I'm a teapot");
?>
これだけで返せます。
これだけ。
マジで。
htaccessとかその他細かいやつをいじる必要はほぼないです!
しいて言うならPHPを実行できるようにしておく、くらいでしょうか。マジで楽だあ。
これをページファイルの冒頭に置いて、その下につらつらと実際のページ内容を書いていくだけであら不思議。
超簡単に418を返すコードができてしまいました。
僕のサイトがだいたいこんな感じの表示なんですが、DevToolsでログを見てみると、ちゃんと『418 I'm a teapot』が返されています。
すげえ。
他のコードもいけますか?
実験しました。ほぼここらへんは使う時無いでしょうけどね。
変な三桁数字
<?php
header("HTTP/1.1 925 I'M BREAKING RULES!!!!");
?>
925を返すようにします。この数字に深い意味はありません、適当です。
返ってきました。これはいけるみたい。
四桁の数字
<?php
header("HTTP/1.1 5238 YEAAAAAAAAAAAAAAAAAHHHHHHHHHHHHHH!!!!");
?>
500 Internal Server Errorでした。
無念。
アルファベット
<?php
header("HTTP/1.1 0EX FOOOOOOOOOOOOOOOOOO!!!!");
?>
これもダメでした。
残念。
まとめ
てなわけで、実はめちゃめちゃ簡単に好きなステータスコードって返せちゃうんですね。
もちろん、変なことをするとクライアントが困るかもしれないので、節度を持ってやりましょう。というか普通にインターネッツする分にはデフォルトのコードすら数個しか使わない。
まぁ、418を実装したいときにはぜひこの記事見てみてくださいね。
では。