ホームページや、書籍などでフリーで公開されている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改行コードの場合

メモ帳 Windows改行コードの場合 メモ帳 UNIX改行コードの場合

これと同様のことが、UNIXサーバ上で起こるわけです。つまり、Windows上で作成した、もしくは編集したCGIファイルを、BINARYモードでサーバへ転送してしまうと、サーバではCGIファイルの改行が読み取れずに、1行だけのファイルとみなしてしまいます。したがって、「Internal Server Error」がでてしまうわけです。

さて、ASCIIモードですが、このモードは、改行コードを、送信先のサーバの改行コードに変換して送るモードなのです。

FTPソフトによっては、「ASCIIモード」を「テキストモード」と表記しているものもあるようです。代表的なWindows用FTPソフトの「ASCIIモード」への切り替えを紹介します。

NextFTP NextFTP http://www.toxsoft.com/
NextFTP NextFTP

ウィンドウ上部の「abc」ボタンを押してください。この状態で転送すれば、ASCIIモードとなります


FFFTP FFFTP http://www2.biglobe.ne.jp/~sota/
FFFTP FFFTP

ウィンドウ上部の「A」ボタンを押してください。この状態で転送すれば、ASCIIモードとなります。


FTP Explorer FTP Explorer http://www.ftpx.com/
FTP Explorer FTP Explorer

ウィンドウ上部の「A」のボタンを押してください。この状態で転送すれば、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」のアルファベットの意味は、次のとおりです。

読み取り権限 ファイルの中身を見ることができるかどうかをあらわします。権限がない場合には、「-」となります。
書き込み権限 内容を更新したり、削除することができるかどうかをあらわします。権限がない場合には、「-」となります。
実行権限 ファイル(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
Step2
           

Step1 権限があるものに対して、「1」を割り当て、権限のないものについては、「0」を割り当てます。つまり、「r」「w」「x」それぞれに対しては「1」を、「-」に対しては「0」を割り当てます。
Step2 オーナー権限、グループ権限、その他の権限に分割します。つまり、頭から3つづつに区切ります。その区切りごとに、2進数の数字とみなし、それを10進数に変換します。たとえば、2進数で「111」であれば、10進数では「7」となります。以下に3桁の2進数の数字に対して、10進数ではどうなるかを表にしておきます。

パーミッション

2進数

10進数

−−−

000

−−x 001
−w− 010
−wx 011
r−− 100
r−x 101
rw− 110
rwx 111

■パーミッション変更方法

パーミッションの変更は、FTPソフトによって異なります。それぞれのパーミッション変更方法を紹介します。

NextFTP NextFTP
FFFTP FFFTP
FTP Explorer FTP Explorer
Transmit Transmit (Mac)

 CGIをカスタマイズするにあたり、設定内容を変更することがあろうかと思います。たとえば、

$mail = 'foo@bar.co.jp';

とあった場合、メールアドレスの部分を変更するとします。この例では、メールアドレスがシングルクォーテーションで囲まれています。このときには、何も気にせず、そのままメールアドレスを書き換えてあげれば問題ありません。ただし、シングルクォーテーションを入れることはできません。

しかし、

$mail = "foo\@bar.co.jp";

のように、ダブルクォーテーションで囲まれている場合には、注意が必要です。指定する文字列の中に「"」「@」「$」「\」「%」を指定したい場合には、その記号の前に「\」を入れる必要があります。例では、$mail という変数に、「foo@bar.co.jp」を指定したかったのだが、「@」が含まれているので、「@」の前に「\」を加えているということです。

 CGIのカスタマイズで、ソースを書き換える場合に、全角スペースが入らないように注意しましょう。Perlスクリプトでは、全角スペースと半角スペースはまったく別物です。全角スペースが入ってしまった場所によっては、CGIが起動できません。

CGIを書き換えるときには、全角スペース、タブ、改行などを視覚的に見ることができるテキストエディターをお使いになることをお勧めします。

TeraPad TeraPad
TeraPad

EmEditor EmEditor
EmEditor

ViVi ViVi
ViVi

さて、全角スペースがどのような場所に入ると駄目になるかを例で示します。例では全角文字を「」であらわしております。

(1) $var = 'Hellow!';
(2) $var= 'Hellow!';
(3) $var ='Hellow!';
(4) $var = 'Hellow!';

(5) $var = 'Hellow!';

(1) 〜 (4) はすべてエラーとなってしまいます。(5) はエラーにはなりません。つまり、シングルクォーテーションもしくはダブルクォーテーションで囲まれた中であれば、問題ありません。

 一般に配布されているCGIでは、ほとんど、みなさんがカスタマイズできるように、設定項目があります。CGIファイルをテキストエディターで開くと、上のほうにそれらの項目欄が記述されているかと思います。その設定の記述で、「フルパス」「相対パス」という言葉が出てくるかと思います。これらの意味を取り違えると、CGIが動作しなくなります。

パスの意味には、大きく分けて2つあります。

以下のディレクトリ構成を例にとり説明します。

ディレクトリ構成   相対パス   絶対パス
/ (サーバのルート)    
 Folder  home/
   
  Folder  hoge/
   
   File index.html
  ../index.html   /home/hoge/index.html
   Folder  cgi-bin/
   
    File  this.cgi
   
    File  config.dat
  ./config.dat   /home/hoge/cgi-bin/config.dat
    Folder  dir
   
     File  file.log
  ./dir/file.log   /home/hoge/cgi-bin/dir/file.log
   Folder  images/
   
    File  image.gif
  ../images/image.gif   /home/hoge/images/image.gif

相対パス

CGIファイルから見て、どこにあるかを示します。上図では、「this.cgi」から見た、各ファイルを相対パスを記載しております。同じディレクトリ内を示す場合には、「./」、一つ上のディレクトリを示す場合には、「../」をファイル名の前につけます。2つ上のディレクトリの場合には、「../../」をファイル名の前につけます。

絶対パス

サーバのルートディレクトリから見てどこにあるかを示します。Windowsでいえば、「C:\windows\system」と指定するようなものです。ほとんどのサーバは、UNIXですので、「/home/hoge」のような記述になります。プロバイダーでご利用の、ご自分のホームディレクトリの絶対パスは、ご利用のプロバイダーに確認してください。

戻る

会社案内 | 特定商取引法に基づく表示 | プライバシーポリシー | 当サイトへのリンクについて | お問い合わせ