Perl/CGI研究室 'PERL-LABO'

Perl/CGI研究室 'PERL-LABO' TOPへ
戻る(History.Back)

Hello world ! - HTML出力の研究

研究内容

「Hello world !」という文字列を出力するだけの簡単なCGIプログラムを作成します。

結果

まずはとにかく動くCGIプログラムを

ただ、テキストをブラウザ上に表示するだけ。 たぶんもっとも基本的なCGIプログラム。 必要な知識は、1行目のアレ、print文、FTP、パーミッション。 でも結構奥が深かったりします。あれこれトラブります。 個人的想像ですが、Perl/CGIをちょっとやってみようと思ったけど 結局なにもできずに挫折した人もおられるんではないでしょうか? 管理人も実は、結構苦労したんです…。

cgiファイルを作る

さて早速とりかかりましょう。 まずは、自分のパソコンで空のcgiファイルを作成します。 管理人は、「新規作成」-「テキストドキュメント」とかして、 拡張子をcgiに変えたりしていますが方法はなんでもいいですね。

cgiファイルをメモ帳で開きます。そうそう、Perlのプログラムを作るには テキストエディタならなんでもいいんですが、管理人は原始的にメモ帳です。 もっと使いやすいエディタはたくさんあると思いますが、持っていないし…。 で、初めてのPerlプログラム作成開始です!

1行目のアレ

1行目は、例のアレです。

#!/usr/bin/perl

これで、このファイルがPerlのプログラムなんだってサーバーに教えてあげるんでした。 Perlのパスはサーバーによって違うということも忘れずに、正しいパスを入力しましょう。

print文

そしてここからです。CGIプログラムというのは、なにか出力すると、その出力がブラウザに送られる、 というものでしたね。それじゃ出力というのはどうやってやるのかというと、 Perlのprint文というものを使います。

print "Hello World!";

これが、「Hello World!」と出力するPerlの命令です。 文字列を " で囲っています。" というのは、この中が文字列ですよっていう意味ですね。 これが無いとエラーです。 行末の ; は、これで1つの命令が終わりです、というような意味です。 これも忘れるとエラーになってしまうので忘れないようにしましょう。

完成?

まとめると、"Hello World!"と出力するPerlプログラムは

#!/usr/bin/perl

print "Hello World!";

となります。2行目に空行を入れましたが、これは見やすくするためで意味はありません。 無くてもいいし、もっと沢山空行があってもいいです。 何も書かれていない空行は、Perlでは無視されますので。

これで完成?たしかに、これはPerlのプログラムとしては正しいです。 ちゃんと動きます。 …でも、これではCGIとしてはまだ正しく動作しません。 まだ足りないことがあるんです。

必要なHTTPヘッダを出力しましょう

HTTPヘッダというものを少し学ばなければいけません。

まず、 HTTPというのは、URLの先頭に付いているやつですが、ブラウザとサーバーの間の データのやり取りの ルールの名前なんです。プロトコル、とも呼ばれます。で、このHTTPというデータのやりとりのルール ですが、「サーバーからブラウザに送られるデータは、 次の形式になっていなければならない」っていう決まりごとを定めてます。

HTTPヘッダ(複数行でもOK)
(空行)
なんかデータ(テキストでも画像データでなんでもOK、とにかくデータ)

言葉で説明すると、サーバからブラウザに送られるデータは、 最初に何行か分からないけれどもテキストのHTTPヘッダというものがあって、 その後に空行があって、そのあとにデータがある。ということになります。

ここまでの説明で、単にCGIから「Hello world!」と出力しただけだと、 ブラウザは「Hello world!」をHTTPヘッダだと誤解してしまうことが分かりますね。 それに、上のプログラムだと必ず無ければいけないヘッダの後の空行もありません。 なので、上のプログラムはこのままでは駄目で、正しく動くためには、正しいHTTPヘッダを出力して あげないといけないんです。

それじゃHTTPヘッダって何?というと、例えばそのファイルが作られた日付とか、 ファイルの大きさとか、そういう、ブラウザ上に表示されるものではないけれど、 ブラウザにとって必要な情報が入っているんです。いろんな情報を入れることが できるようなんですが、それを全部学ぶ必要は無さそうです。1つだけ知っていれば、 上のプログラムは正しく動くようになります。 それは、「空行の後のデータがHTMLであることを ブラウザに知らせるヘッダ」です。

普通、拡張子がhtmの場合はHTMLファイルですね。 拡張子がtxtの場合はテキストファイル。拡張子がjpgならJPEGファイル…というように、 拡張子でファイルの中身を指定するのが普通です。でもこれ、Windowsの場合だけなんですね。 UNIX、Linuxといったマシンでは、もともと拡張子という概念がなくて、 拡張子を付けるのは、人間が見て分かりやすくするためであって、 HTMLファイルはhtmじゃないと駄目!っていうわけじゃないんです。 ヘンな話、拡張子がhtmのJPEGファイルがあってもいいし、 拡張子がjpgのHTMLファイルがあってもいいんです。 普通はそんなことしませんけども。 それに、CGIプログラムは拡張子がcgiでしたね。 CGIはHTMLを出力するとは決まってないのですし、これじゃ、 ブラウザ側では、送られてきたデータが 何のデータなのかわからないです。

それじゃ、ブラウザはどうやって、そのファイル、そのデータがHTMLなのかJPEGなのかということを 知るのでしょうか?それは、サーバーがHTTPヘッダの中で、「このファイルは○○ですよ、 だから○○として処理してくださいね」っていうことをブラウザに伝えているのです。 これは、htmファイルやjpgファイルの場合はサーバーが勝手にやってくれます。

ところがコレ、CGIの時には困るんですよね。サーバーも、 そのCGIの出力が何かっていうことは知らないんです。 ですから、サーバーは、CGIを実行したときはHTTPヘッダのうち、 「空行の後のデータがなんのデータなのかを ブラウザに知らせるヘッダ」を自動的にはブラウザに伝えてくれないのです。 それ以外の必要なヘッダは勝手に付け足してくれるのですが、 これだけは自分でやらないといけないんです。

さあ、我々が必要な、「これから送るのはHTMLのデータですよ!」とブラウザに伝える ヘッダは、次のようなものです!

Content-type: text/html
完成!

先に作ったPerlプログラムを修正して、正しいHTTPヘッダを出力するようにしました。 それに、HTTPのルールに従って、ヘッダの後に空行を出力するようにしました。 次のようになります。

#!/usr/bin/perl

print "Content-type: text/html\n";
print "\n";
print "Hello World!";

\n というのは、改行という意味です。 説明すると、 まずHTTPヘッダを出力して、空行を出力して、そして「Hello World!」を出力する。 これでバッチリ、ルール通りの出力です。これなら、ブラウザもちゃんと理解してくれるでしょう。

ちなみに、このプログラムはHTMLのソースとして次のテキストをブラウザに送るということですね。

Hello World!

これ、HTMLソースとしては正しくありませんね。<html>とか<body>とかがありません。 でも、ブラウザはちゃんと理解してくれますから良しとしましょうね (^^

FTPとパーミッション

これでCGIプログラムが完成しました。これをサーバー上で実行するためには、 サーバーにFTPでアップロードしないといけません。この時、テキストモードでFTPすることを 忘れてはいけません。そして、アップロードしたら、ファイルのパーミッションを変更して、 実行権を与えます。正しいパーミッションはサーバによって違うというのは研究済みですね。 このサーバーの場合はsuExecがあるので自分に実行権を与えます。さらにセキュリティの ために他人には書き換えることができないようにします。 具体的には704です。これで完了です! お疲れ、俺。

作成したCGIプログラム

helloworld.cgi
#!/usr/bin/perl

print "Content-type: text/html\n";
print "\n";
print "Hello World!";

実行結果

helloworld.cgiを実行する! (別窓で開きます)

考察

初めて作ったCGIプログラム、それはやっぱり伝統の「Hello world!」でした (^^

画面に表示する文字列をいろいろ変えてみたり、 わざとエラーにしてみたり、パーミッションとか変えてみたり、 そんなことをしてみて、なんとなく、なるほど、と思ったりします。

かなり基本でありながら、いろんなことが絡み合って難しいです。 最初なんだけど、結構大きな壁になったりします。 でもここを突破すると、後は、スピードはともかく、着実に進む…といいな。

分かったこと

  1. 文字列を出力するにはprint文を使います。
  2. CGIプログラムからは最初に正しいHTTPヘッダを出力しなきゃいけません。
  3. CGIプログラムでHTMLを出力するにはHTTPヘッダ「Content-type: text/html」が必要です。
  4. HTTPヘッダの後ろには空行を出力します。
Perl/CGI研究室 'PERL-LABO' TOPへ
戻る(History.Back)

Copyright (c) 'PERL-LABO' All Rights Reserved.  リンクフリーです。