ホームページや、書籍などでフリーで公開されているCGIをセットアップしたけど、うまく動かなくて困っていませんか? 「Internal Server Error」って出てきませんか? うまく動かないには、ほとんどの場合、セットアップする側に問題があります。しかし、原因がわかりませんよね。
実は、wwwサーバが出力するエラーログから、CGIが動かなかった理由のヒントが得られるのです。しかし、ほとんどのプロバイダーではこのエラーログを見ることができません。したがって、自分で原因を探るしかないのです。
しかし、原因はさほど多岐にわたりません。以下に示す7ヶ条を読んで、もう一度、お試しのCGIを確認してみてください。これで、悩みも解決するかもしれませんよ。
【CGIセッティング7ヶ条】
手に入れたCGI関連のファイルのほとんどは、テキストファイルです。それらのファイルをプロバイダーのサーバへアップロードするときには、必ずASCIIモードで転送してください。仮にBINARYモードで転送すると、「Internal Server Error」となってしまいます。
FTPソフトでよく「転送モード自動判定」なる機能がありますが、信用してはいけません。転送モード自動判定は、転送するファイルが、既知の拡張子であれば、問題なく判別してくれますが、そうでないものは、BINARYモードで転送するようです。したがって、手間かと思いますが、あえてASCIIモードを指定して、CGIファイルを転送してください。
ところで、そもそも「転送モード」って何なのかご存知ですか? 簡単に説明します。
まず、転送モードを理解する前に、「改行コード」を理解しなくてはいけません。世の中、Windowsしかないなら問題にならないのですが、「Unix」「Mac」などさまざまなOSが存在しております。OSによって、テキストの改行を示すコードが異なるのです。したがって、Windows上で作ったテキストファイルをUNIX上で見たとしても、改行を正しく理解してくれません。逆に、UNIX上で作られたテキストファイルをWindows上で見たとしても、同様です。この場合、Windows標準テキストエディター「メモ帳」を使うとよく分かります。UNIX上の改行コードが理解できずに、黒塗り文字で表現されてしまい、さらに1行とみなされてしまいます。
|
Windows改行コードの場合
|
UNIX改行コードの場合
|
 |
 |
これと同様のことが、UNIXサーバ上で起こるわけです。つまり、Windows上で作成した、もしくは編集したCGIファイルを、BINARYモードでサーバへ転送してしまうと、サーバではCGIファイルの改行が読み取れずに、1行だけのファイルとみなしてしまいます。したがって、「Internal Server Error」がでてしまうわけです。
さて、ASCIIモードですが、このモードは、改行コードを、送信先のサーバの改行コードに変換して送るモードなのです。
FTPソフトによっては、「ASCIIモード」を「テキストモード」と表記しているものもあるようです。代表的なWindows用FTPソフトの「ASCIIモード」への切り替えを紹介します。
各CGIファイルには、1行目に必ず「#!/usr/local/bin/perl」のような記述があるはずです。ここの記述は、プロバイダーによって異なります。必ずプロバイダーが指示するように記述してください。ただ、ほとんどのプロバイダーでは、「#!/usr/local/bin/perl」で問題ないようです。
しかし、「#!/usr/bin/perl」「#!/bin/perl」の場合も否定できませんので、必ず確認してください。
ちなみに、この記述は1行目でないと意味がありません。2行目、3行目に記述されていたとしても意味をなしませんので、ご注意ください。
ダウンロードしたCGIの一連のファイルは、すべてアップロードしましょう。本体のCGI以外にも、「jcode.pl」や「cgilib.pl」などのライブラリー関連を必要とする場合が多々あります。本体のCGIは、これらのライブラリーがないと動作しません。また、これらのライブラリーを設置する場所(ディレクトリ)にも気をつけましょう。ほとんどが、本体のCGIと同じディレクトリにアップロードすれば動作します。
本体のCGIのソースをみて、これらの情報を得ることができます。たとえば、
require 'jcode.pl';
とあれば、本体のCGIと同じディレクトリに、「jcode.pl」が必要ということです。「require './jcode.pl';」のように、「./」があっても同じ意味です。
CGIのファイルをサーバへアップロードしただけでは、絶対に動きません。必ずプロバイダー指定のパーミッションに変更する必要があります。では、パーミッションとは何でしょう。主に数字3桁で表現されますが、「-rwx---r-x」と表記する場合もあります。
まず、パーミッションの説明をするにあたって、「-rwx---r-x」の表記を理解しましょう。この表記は大きく4つのパートに分けられます。
| - |
r |
w |
x |
- |
- |
- |
r |
- |
x |
| (1) |
(2) |
(3) |
(4) |
(1) ファイルなのかディレクトリ(フォルダ)なのかを識別します。もしファイルであれば、「-」となり、ディレクトリであれば、「d」となります。
(2) オーナーのパーミッションです。オーナーとは、持ち主のことで、あなたがお使いのアカウントのことを指します。「r」「w」「x」のアルファベットの意味は、次のとおりです。
| r |
読み取り権限 |
ファイルの中身を見ることができるかどうかをあらわします。権限がない場合には、「-」となります。 |
| w |
書き込み権限 |
内容を更新したり、削除することができるかどうかをあらわします。権限がない場合には、「-」となります。 |
| x |
実行権限 |
ファイル(CGI)を実行できるかどうかを表します。権限がない場合には、「-」となります。 |
(3) グループのパーミッションです。UNIXの世界には、アカウントという概念に加え、グループという概念があります。すべてのアカウントは何かしらのグループに属することになります。(3) の部分が示すパーミッションは、そのグループに属するすべてのアカウントに対して適応されます。(3) の部分は3つに分かれますが、(2) と同様、左から「読み取り権限」「書き込み権限」「実行権限」をあらわします。例では、すべて「-」ですので、同じグループに属する他のアカウントの権限では、見ることすらできないということです。
(4) 本人でもなければ、本人が属するグループでもないアカウントに対して適応されるパーミッションです。
今までの説明では、分かったようで分からなかったかもしれませんね。具体例を見ながら理解していきましょう。
まず、FTPでファイルをアップロードしたり、削除する場合を考えてみましょう。FTPでアクセスしたということは、オーナーの権限でアクセスしていることになります。したがって、?Aのパーミッションが適応されます。読み取り権限「r」があれば、そのファイルをダウンロードすることができます。もし読み取り権限がないと、自分のファイルなのに、ダウンロードすることすらできないのです。次に、書き込み権限「w」があれば、削除することができます。もし、書き込み権限がないと、削除することができません。もちろん、上書きでアップロードすることもできません。
次に、例をかえて、ブラウザーであなたのホームページを見るときを考えてみましょう。ブラウザーであなたのページ(ファイル)を見るときには、通常、「nobody」などの専用のアカウントの権限でみることになります。つまり、オーナーでもなければ、グループにも属さないアカウントで、あなたのファイルを見ようとしているわけです。この場合、?Cの読み取り権限「r」が必要なわけですね。もし、?Cの読み取り権限がない場合には、あなたの作ったホームページをブラウザーから見ることができなくなります。逆に、見せたくない場合に、この手段を使うわけです。
最後に、実行権限「x」ですが、CGIを例にたとえます。どのアカウントでCGIが起動されるかということにかかわってきます。どのアカウントの権限で実行するかどうかは、プロバイダーによって異なりますが大きく分けて2つしかありません。
もし、あなたの使っているプロバイダーのサーバが、オーナーの権限で実行するようになっていれば、?Aの部分の実行権限「x」が必要なわけです。もし、nobodyなどの特別なアカウントで実行するようになっていれば、?Cの部分の実行権限「x」が必要となります。
さて、パーミッションの意味がなんとなくわかったところで、3桁の数字で表記するにはどうすればよいのでしょうか。変換の手順は、下図のとおりです。
|
r |
w |
x |
- |
- |
- |
r |
- |
x |
| Step1 |
↓ |
↓ |
↓ |
↓ |
↓ |
↓ |
↓ |
↓ |
↓ |
|
1 |
1 |
1 |
0 |
0 |
0 |
1 |
0 |
1 |
| Step2 |
|
↓ |
|
|
↓ |
|
|
↓ |
|
|
|
7 |
|
|
0 |
|
|
5 |
|
| Step1 |
権限があるものに対して、「1」を割り当て、権限のないものについては、「0」を割り当てます。つまり、「r」「w」「x」それぞれに対しては「1」を、「-」に対しては「0」を割り当てます。 |
| Step2 |
オーナー権限、グループ権限、その他の権限に分割します。つまり、頭から3つづつに区切ります。その区切りごとに、2進数の数字とみなし、それを10進数に変換します。たとえば、2進数で「111」であれば、10進数では「7」となります。以下に3桁の2進数の数字に対して、10進数ではどうなるかを表にしておきます。
|
パーミッション
|
2進数
|
10進数
|
| −−− |
000
|
0
|
| −−x |
001 |
1 |
| −w− |
010 |
2 |
| −wx |
011 |
3 |
| r−− |
100 |
4 |
| r−x |
101 |
5 |
| rw− |
110 |
6 |
| rwx |
111 |
7 |
|
■パーミッション変更方法
パーミッションの変更は、FTPソフトによって異なります。それぞれのパーミッション変更方法を紹介します。
CGIをカスタマイズするにあたり、設定内容を変更することがあろうかと思います。たとえば、
$mail = 'foo@bar.co.jp';
とあった場合、メールアドレスの部分を変更するとします。この例では、メールアドレスがシングルクォーテーションで囲まれています。このときには、何も気にせず、そのままメールアドレスを書き換えてあげれば問題ありません。ただし、シングルクォーテーションを入れることはできません。
しかし、
$mail = "foo\@bar.co.jp";
のように、ダブルクォーテーションで囲まれている場合には、注意が必要です。指定する文字列の中に「"」「@」「$」「\」「%」を指定したい場合には、その記号の前に「\」を入れる必要があります。例では、$mail という変数に、「foo@bar.co.jp」を指定したかったのだが、「@」が含まれているので、「@」の前に「\」を加えているということです。
CGIのカスタマイズで、ソースを書き換える場合に、全角スペースが入らないように注意しましょう。Perlスクリプトでは、全角スペースと半角スペースはまったく別物です。全角スペースが入ってしまった場所によっては、CGIが起動できません。
CGIを書き換えるときには、全角スペース、タブ、改行などを視覚的に見ることができるテキストエディターをお使いになることをお勧めします。
さて、全角スペースがどのような場所に入ると駄目になるかを例で示します。例では全角文字を「□」であらわしております。
(1) $var = 'Hellow!';□
(2) $var□= 'Hellow!';
(3) $var =□'Hellow!';
(4) □$var = 'Hellow!';
(5) $var = '□Hellow!';
(1) 〜 (4) はすべてエラーとなってしまいます。(5) はエラーにはなりません。つまり、シングルクォーテーションもしくはダブルクォーテーションで囲まれた中であれば、問題ありません。
一般に配布されているCGIでは、ほとんど、みなさんがカスタマイズできるように、設定項目があります。CGIファイルをテキストエディターで開くと、上のほうにそれらの項目欄が記述されているかと思います。その設定の記述で、「フルパス」「相対パス」という言葉が出てくるかと思います。これらの意味を取り違えると、CGIが動作しなくなります。
パスの意味には、大きく分けて2つあります。
以下のディレクトリ構成を例にとり説明します。
| ディレクトリ構成 |
|
相対パス |
|
絶対パス |
| / (サーバのルート) |
|
|
|
|
 |
 |
home/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
../index.html |
|
/home/hoge/index.html |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
./config.dat |
|
/home/hoge/cgi-bin/config.dat |
|
|
|
|
|
|
|
|
|
./dir/file.log |
|
/home/hoge/cgi-bin/dir/file.log |
|
|
|
|
|
|
|
|
|
../images/image.gif |
|
/home/hoge/images/image.gif |
相対パス
CGIファイルから見て、どこにあるかを示します。上図では、「this.cgi」から見た、各ファイルを相対パスを記載しております。同じディレクトリ内を示す場合には、「./」、一つ上のディレクトリを示す場合には、「../」をファイル名の前につけます。2つ上のディレクトリの場合には、「../../」をファイル名の前につけます。
絶対パス
サーバのルートディレクトリから見てどこにあるかを示します。Windowsでいえば、「C:\windows\system」と指定するようなものです。ほとんどのサーバは、UNIXですので、「/home/hoge」のような記述になります。プロバイダーでご利用の、ご自分のホームディレクトリの絶対パスは、ご利用のプロバイダーに確認してください。