CGIスクリプト作成の注意事項

CGIスクリプトを記述する際に注意しなければならないことを、
UNIXサーバーの場合、Windowsサーバーの場合に分けて説明します。
(多くのプロバイダではUNIXサーバーを利用しています。
たまに Windows NTサーバーもあるようです。)

● サーバーがCGIをサポートしていない(共通) セキュリティ確保のため
CGIの使用を禁止していたり、CGIの設定を 行っていなかったりするため、
CGIを利用できない場合があります。

● .htaccessファイルが必要?(UNIX) サーバが Apache などの場合、
.htaccess というファイルの設定 が必要な場合があります。
プロバイダやサーバー管理者に問い 合わせてください。また、.htaccess に
記述しても有効にならない 場合もありますので、サーバーの管理者の
指示に従ってください。

● ローカルファイルを実行しようとしてる(共通) CGIスクリプトの動作チェックは
必ず、 http:// で始まるアドレスでアクセスしなくてはなりません。

● perlのパス名があっていない(UNIX) CGIスクリプトの1行目は、
perlの絶対パス名(ディレクトリ上の位置) を正確に指定してください。
絶対パス名がわからない場合は、 プロバイダの説明を読んだり、サーバーの
管理者に問い合わせてください。 多くの場合、/usr/local/bin/perl や、/usr/bin/perl
などに置かれています。

●CGIスクリプトの場所が適切でない(共通) サーバーの設定によっては
CGIスクリプトを置くディレクトリが制限 されている場合があります。
普段 HTMLファイルを置いているのと は別のサーバーに設置しなくて
はならないプロバイダもあります。
CGIスクリプトを置く場所がこのホームページで説明されている場所 と合わない
場合は、プロバイダの指示などに従って、 適切にディレクトリを変更してください。

● CGIスクリプトの拡張子が適切でない(共通) CGIスクリプトの拡張子が
.cgi でなくてはならない場合があります。 他にも .pl でなくてはならない場合もあります。
これらも、サーバーの設定によって異なります。

● perlがインストールされていない(Windows) Windows NTにはperlが標準では
装備されていませんから、 perl for Win32 や ActivePerl を入手してインストールする
必要があります。また、MicrosoftのIISを用いる場合は、
.cgi という拡張子に対して perl.exe が起動されるように、
IISのヘルプを参照して設定を行う必要があります。

● CGIスクリプトのパーミッションが誤っている(UNIX) サーバーがUNIXの場合は、
CGIスクリプトファイルの パーミッションを755にしてください。
また、CGIスクリプトが書込むデータファイルは、666 にし てください。
一部のプロバイダでは、700 や 600 で なければならないところもあるそうです。

●ユーザーの権限設定が誤っている(Windows) MicrosoftのIISでは、
IUSER_MachineName というユーザーの 権限でコマンドが実行されます。
このユーザーがCGIスクリプトを 実行する権限を持っているか確認してください。

●ファイルの所有者が変(共通) 他のサーバーからデータファイルを移行させたときなど、
ファイルの所有者が nobody でなくてはならないのに、 自分自身の所有になっていて、
パーミッションが 644 でも CGIがファイルに書き込めないことがあります。

● CGIスクリプトの改行コードが変(共通) CGIスクリプトファイルの改行コードは、
サーバーのOSタイプ に適したものでなくてはなりません。

● .htaccessの改行コードが変(共通) .htaccessを設置する場合は、.htaccessの
改行コードもまた、 サーバーのOSタイプにあわせてやる必要があります。

● .htaccessの最後の行が改行されていない .htaccessの最後の行が
改行されていないと、その行は無視されてしまうようです。

● CGIスクリプト内で使用するコマンドのパスが変(共通) スクリプト実行時、
スクリプト内で使用するコマンドのパス(PATH) が通っていない場合があります。
TELNETなどでログインした時のPATHと、 CGIスクリプトが実行される時の
PATHは異なるので注意してください。
コマンドはなるべくフルパスで記述したほうが無難かもしれません。

●最初の1行が変(UNIX) CGIスクリプトの最初の1行は「#!」で始めるようにしてください。
CGIスクリプトは「#!」で始めなくてはなりません。
「#!」の前に空白文字や空行があってもいけません。

●ヘッダ行のあとの空行が無い(共通) Content-type: text/html などの
CGIヘッダの後には必ず、 1行以上の空行を出力してください。
これを怠るとCGIスクリプトは正常に動作しませ ん。

● 大文字、小文字の区別が誤っている(UNIX) UNIXというOSは通常、アルファベット
の大文字と小文字を別 の文字として扱いますので注意してください。たとえば、
test1.cgi と TEST1.CGI はまったく別のファイルとして扱われます。

●ブラウザのキャッシングに惑わされている(共通) ブラウザがCGIスクリプトの結果
をキャッシングするために、 スクリプトを書き換えても古い情報が表示されたりします。
CGIスクリプト変更時には十分に注意して、 再読み込みを欠かさないようにしましょう。

● ヘッダにスペルミスがある(共通) 意外に多いのがこれ。Context-type: になっていたり、
test/html や type/html になっていたり もう一度確認してみましょう。

● CGIスクリプトの出力漢字コードが変(共通) CGIスクリプトから出力する漢字コードは
JISコードにする のが無難です。通常はブラウザが自動判断するのですが、
Windowsで使用されているシフトJISと、UNIXで使用されて いるEUCの場合は
誤判断してしまうことがあります。

●ブラウザの漢字コード選択が変(共通) EUCのファイルを書き出しているのに、
ブラウザの文字コード選択 ([表示]-[エンコード])がシフトJISのままになっていて、
うまく表示 できないケースがあるようです。

●ファイルへの同時アクセスに注意(共通) CGIスクリプトは複数のブラウザ
(ひとつのブラウザからでも) 同時に起動されます。CGIスクリプトからファイルを更新する際は、
ロックファイルの生成などにより排他制御を行う必要があります。

●ブラウザの[画像表示]チェックがオフになっている(共通) CGIを<img>タグから呼び出す場合、
Netscapeの場合 [オプション]→[画像の自動読み込み]、Internet Explorerの場合
[表示]→[オプション]→[情報]→[画像の表示]がオンになっていないと 読み込まれません。

● text/plain のわな(共通) Content-type: text/plain を使用した場合、
Internet Explorer 3.0以降ではうまく動かないことがあります。
[表示]→[オプション]→[プログラム]→[ファイルタイプ]で、
.cgiという拡張子のファイルにメモ帳などのプログラムを割り当 てている場合、
text/plain 形式の実行結果をダウンロードしてしまい、
期待通りの動作をしないことがあります。

●カレントディレクトリの差異(Win) Windows NT + IISの場合は、CGIスクリプトが
動作する際の カレントディレクトリ(作業フォルダ)の場所が異なる場合があります。
スクリプトの最初の方に、chdir("C:/HomePage/cgi-bin"); など
の1行(C:/〜の部分にはCGIスクリプトを置いているフォルダ を指定する)
を追加することで回避できる場合があります。

●もう一度スペルチェック(共通) すべて確認したのに、どうしても動かない
・・・そういう時は、 もう一度、すべてのスペルをチェックしてみましょう。
大文字・ 小文字もあわせて見てください。l(小文字のエル)と I(大文字のアイ)
と 1(数字の1)は間違えやすいので気を付けてください。

● アットマーク(@)の扱い Perl5でダブルクォーテーション("...")の間にアットマーク
(@) を記述する場合は @ を \@ と記述する必要があります。 Perl4の場合や、Perl5
であってもシングルクォーテーション('...') であればそのまま @ と記述できます。

● 画像ファイルに広告データが挿入される 広告付きのサイトを利用している場合が、
カウンターなどの画像 データにまで、広告画像が自動的に挿入されてしまい、
画像データが壊れてしまうケースがあるようです。
対策は利用サーバのマニュアルなどを参照ください。

● Perlのバージョンが異なる サイトによっては perl のバージョンが 3 や 4 など
古いバージョン だったり、perl 5 を利用するには /usr/bin/perl5 や /usr/local/bin/perl5
のように指定する必要があるサイトもあるようです。

●CGIの仕様が一般と異なる print "Content-Type: text/html\n\n" の
前に、 print "HTTP/1.0 200 OK\n" の追記が必要など、 サイトによっては
CGI の仕様が一般のものと多少異 なる場合があるようです。