bashでCGI (2) CGIのおまじない

こんにちは、河野です。bashでCGIの2回目です。

今回は「おまじない」の部分についてです。

おまじないとは

僕がCGIを始めたのは2000年間近のころで、Y2K問題とか言われていたころです。当時はCGIの最初の数行を「おまじない」として教わっていました。「理由はともかくこう書かないといけないんだよ」という感じでした。

前回はechoの部分からを「おまじない」と表記していますが、この辺りは諸説あるようですので、ファイルの1行目から解説していきたいと思います。

1行目について

#!/bin/bash

の部分ですが、これはshebangですね。Unix/Linux上でスクリプトを実行させるために必要な記述です。

簡単に言えば、先頭2バイトが#!だった場合に、指定されたプログラムにファイル名が引数として渡され、実行されるというルールです。

ですので、以下のようなsample.cgiがあった場合、

以下の2つの実行方法は同じことになります。

指定するプログラムは、bashやperlなど、スクリプトを実行させるためのコマンドでなくてもかまいません。
試しに、以下のようなスクリプトを作って実行してみると、

sample.tail

となります。最後の3行が表示されていますね。

shebangについては、以下のページに詳しく記載されています。
UNIXの部屋 コマンド検索:shebang (*BSD/Linux)

echoの出力内容について

このechoの部分ですが、これが無かったらどうなるのでしょうか?

試しに以下のようなスクリプトを実行すると、Internal Server Errorが起こります。

Apacheのエラーログはこんな感じです。

不正なヘッダーだよ!と怒られています。echoしている「No omajinai!!!」に対して、Bad headerだとも言われていますね。

プログラムとして実行はできているものの、その出力内容に問題があるという状態です。

CGIのレスポンスのルール

このレスポンスについても、RFCで定められています。

レスポンスは、メッセージヘッダーとメッセージボディで構成されて、空行(blank line)で区切る。
メッセージヘッダーは1つ以上のヘッダーフィールドからなり、メッセージボディはNULLでも良い。

ということです。

つまり、echo文の2行は、メッセージヘッダーと空行を出力している部分ということですね。
当然、ヘッダーの内容にも意味がありますが、これは後の回で説明していこうと思います。

「おまじない」の意味がようやく理解できました!

改行コードについて

まだまだ気になることがあります。

ヘッダーとボディを区切るために空行が必要と言っても、改行コードはどうしたら良いんでしょう。OSに依存するような気がしますが、だとしたらLinuxだとLFで、WindowsだとCRLFで良いのでしょうか?

RFCを参照しますと、

空行は、LFかもしれないし、CRLFかもしんないよ!と書いてありますね。試してみました。

LF

CRLF

ちゃんと両方実行されています。ヘッダーとボディの区切りは、LFでもCRLFでも大丈夫ということですね。改行コードはLFじゃないとダメだと思っていました…。

ちなみにCRのみだとエラーになります。

注意点

注意してもらいたいのは、あくまでもレスポンスの改行コードです。CGIのファイルそのものに使用している改行コードはLFでないと、bashでの実行エラーになります。

この連載記事においては、以降は以下のようにします。

  • ファイルの改行コードはLF
  • レスポンスのヘッダーとボディの区切りにはCRLF

次回はヘッダーについて掘り下げていこうと思います。

Comments are closed, but you can leave a trackback: Trackback URL.