shell(sh、csh)とPerl(version4とversion5)です。コマンドのパスは次ぎのとおりです。
sh → /usr/bin/sh
csh → /usr/bin/csh
Perl version 4.036 → /usr/local/bin/perl
Perl5 version 5.004_04 → /usr/local/bin/perl5
Perl56 version 5.6.0 → /usr/local/bin/perl56
CGIプログラムの1行目に#!の後に上記のパスを半角で記述します。
#!/usr/bin/sh
#!/usr/bin/csh
#!/usr/local/bin/perl
#!/usr/local/bin/perl5
#!/usr/local/bin/perl56
perlと記述しますと、Perl version 4 になります。perl5、またはperl56を使用してください。CGIプログラムの拡張子は「.cgi」としてください。また、CGIプログラムの属性(パーミッション)に実行可能モードを追加してください。
jcode.pl、cgi-lib.plはインストール済みですので、アップロードされる必要はありませんが、最新バージョンなどをホームディレクトリ以下にアップロードされても構いません。
Perl、Perl5 → jcode.pl version 1.9、cgi-lib.pl version 2.12
Perl56 → jcode.pl version 2.13、cgi-lib.pl version 2.18
ホームディレクトリ以下にアップロードされたときは、require文でそのパスを指定するか、use lib文でそのパスを追加してください(@INCの先頭に追加されます)。 なお、属性(パーミッション)に実行可能モードを追加する必要はありません。
例:
require './lib/cgi-lib.pl'; # './lib'は、現在のディレクトリ下にあるlibというディレクトリ。
または
use lib './lib';
require 'cgi-lib.pl';
CGI.pmのパスは次のとおりです。
Perl → pm(パールモジュール)は、Perl version 4では利用できません。
Perl5 → CGI.pm version 2.36
Perl56 → CGI.pm version 2.56
ホームディレクトリ以下にアップロードされたときは、use lib文でそのパスを追加してください(@INCの先頭に追加されます)。 なお、属性(パーミッション)に実行可能モードを追加する必要はありません。
例:
use lib './lib';
use CGI;
注:CGI.pmはcgi-lib.plやCGI_Lite.pmよりも強力ですが、その分、システムのリソース(CPU、メモリ)を多く必要とします。
sendmail、nkfのパスは次のとおりです。
sendmail → /usr/lib/sendmail
nkf → /usr/local/bin/nkf
CGIプログラムの設置場所は、ホームディレクトリの直下にcgi-binというディレクトリを作成し、その下にCGIプログラムを 置いてください。CGIプログラムの拡張子は、cgiとしてください。
例えば、ユーザIDが sample、掲示板用ディレクトリがboard、CGIプログラム名がboard.cgi、データファイル名が board.dat というような場合には以下のような階層になると思います。
sample (ホームディレクトリ)
|- index.html
|- cgi-bin (cgi-binディレクトリ)
|- board (掲示板用ディレクトリ)
|- board.cgi
|- data (データファイルのディレクトリ)
|- board.dat
サーバー側では大文字、小文字を区別して別の文字とみなしますので、 ディレクトリ名、ファイル名を指定する際は、注意して下さい。
CGIプログラムの属性(パーミッション)は、ftpソフトで実行可能(x)モードを追加してください(644から755にしてください)。
7: 「 オーナ」のパーミッションです。
5: 「グループ」のパーミッションです。
5: 「その他」のパーミッションです。
4bit: r 読み取り可
2bit: w 書き込み可
1bit: x 実行可
通常は、755にしますが、U-netSURFでは、CGIプログラムは「 オーナ」のパーミッションで実行されますので700に設定するのがベストです。「オーナ」のパーミッションは、アップロードのために、7でなければいけません。
"/cgi-bin/cgiwrap/~ユーザID/" の後に CGIプログラム名を指定します。
下記の掲示板のboard.cgiを呼び出すときは、次のようになります。
sample (ホームディレクトリ)
|- index.html
|- cgi-bin (cgi-binディレクトリ)
|- board (掲示板用ディレクトリ)
|- board.cgi
|- data (データファイルのディレクトリ)
|- board.dat
http://www1.u-netsurf.ne.jp/cgi-bin/cgiwrap/~sample/board/board.cgi
<FORM action="/cgi-bin/cgiwrap/~sample/board/board.cgi" method="POST">
<A href="/cgi-bin/cgiwrap/~sample/board/board.cgi">掲示板</A>
※"/cgi-bin/cgiwrap"は、cgiwrapperというプログラムを呼び出すためのものです。
この部分の"/cgi-bin"は、CGIプログラムの設置場所のcgi-binとは別のものです。
cgiwrapperは、「ホームディレクトリの下のcgi-binというディレクトリ下」にあるCGIプログラムを探しにいくように設定されています。
※sampleの下の"cgi-bin"は、呼び出す時に明示的に記述しないでください。以下の指定は間違った例です。
"/cgi-bin/cgiwrap/~sample/cgi-bin/board/board.cgi"
フォームから入力したデータを、漢字コード変換などを行ってからメールする場合のサンプルは以下のとおりです。
・[ send.html ]は、入力画面を生成しています。
・[ send.cgi ]は、send.htmlで作成した画面上で「送信」をクリックされたときに呼び出され、入力画面から受け取ったメッセージをsendmailコマンドでメールしています。
※1行目 #!/usr/local/bin/perl5 は「#!」で書き始めます。 コードのコピー&ペーストで左側に空白文字が入ったとき、削除してください。 ヒアドキュメントの終端文字列 _EOF_ の前後に空白文字を置かないようにしてください。
== send.cgiファイル(CGIプログラムの雛形,EUCでアップロード)== CGIプログラムをEUCでアップロードしますので、パソコンからの入力コードがShift_JISですから、EUCコードに変換する必要があります。
下記の$mailto = 'ユーザID@dp.u-netsurf.ne.jp'; は御自身のメールアドレスに変更ください。 ヒアドキュメント内のFrom:のメールアドレスも変更してください。
ヒアドキュメント内の文字列またはダブルクォート内の文字列に、@がある ときは、配列名でないことを示すために、\@とエスケープしてください。
1行目 #!/usr/local/bin/perl5 は「#!」で書き始めます。 コードのコピー&ペーストで左側に空白文字が入ったとき、削除してください。 ヒアドキュメントの終端文字列 _EOF_ の前後に空白文字を置かないようにしてください。
入力データの取り出し方(入力データのデコード)について
cgi-lib.plパッケージは、CGIプログラムをPerlで記述した場合に使用します。GETやPOST形式に対応、入力データを連想配列に入れ込みます。
1)CGIプログラムの最初の位置でこのパッケージを呼び出します。
2)データを読み込み、date(名前は任意)配列に入れます。&ReadParse(*date);
3)データの取り出しは、$date{'入力データの変数名'}形式です。
$NAME = $date{'name'}
jcode.plパッケージは、CGIプログラムをPerlで記述した場合に使用します。認識できる漢字コード系は、JISコード(jis)、MS漢字コード(sjis)l、および日本語EUC(euc)の3種類です。
1)CGIプログラムの最初の位置でコノパッケージを呼び出します。
require.pl'jcode.pl
2)
データを変換します。
require 'cgi-lib.pl';
require 'jcode.pl';
&ReadParse(*data);
$NAME = $data{'name'};? (cgi-lib.plでデータを取出し)
EUCに変換 &jcode'convert(*NAME、'euc');
JISに変換 &jcode'convert(*NAME、'jis');
SJISに変換 &jcode'convert(*NAME、'sjis');
EUCに変換 /usr/local/bin/nkf -e 入力ファイル > 出力ファイル?
JISに変換 /usr/local/bin/nkf -j 入力ファイル > 出力ファイル
SJISに変換 /usr/local/bin/nkf -s 入力ファイル > 出力ファイル
注:入力ファイル内に半角カナコードを使用しないでください。
sendmailへのオプション「-t」でTo:で指定したところに送信します。Fromが無い時は(Fromの省略時値は)、CGIを実行しているユーザIDにWebサーバ名を付加したものになります。例:sample@www1.u-netsurf.ne.jp
例:ホームページのディレクトリ構造と各ファイルが以下の場合(ユーザIDがsampleの場合)
sample (ホームディレクトリ)
|- send.html
|- cgi-bin (必須;CGIプログラム用ディレクトリ)
|- send.cgi [パーミッション 755]
FTPソフトを使ってパソコンからサーバへファイルをアップロードします。
(1) send.htmlファイルをホームディレクトリにアップロードします
(2) cgi-binディレクトリを作成します
(3) cgi-binディレクトリに移動します
(4) send.cgiファイルをcgi-binディレクトリにアップロードします
(5) send.cgiファイルのアクセス権(パーミッション)を755に変更します
(6) ブラウザからsend.htmlを呼び出してみましょう!
http://www1.u-netsurf.ne.jp/~sample/send.html
(7) 画面にメールアドレス、お名前とメッセージを入力し、”送信”ボタンを押します
(8) メーラソフトを起動してメールが受信できるかどうかを確認します。
メッセージのところに<FONT SIZE="6">フォントサイズ6</FONT>と入力して送信してみてください。文字が大きく表示されます。
太字、罫線<META>(強制的に別ページへ飛ばすタグ)などのタグ、それとタグ閉じ忘れも試してみてください。
このように、タグ付の入力データをそのままhtmlに組み込むと、ブラウザで処理されてしまい、入力データの再表示という単純な目的が果たせません。
メッセージ欄において、すべてのタグを禁止するには, 以下の文を データ取り出し文の次に入れてください。
$message = $data{'message'};
$message =~ s/</</g;#<<< 追加。タグ禁止。
”<”の文字を”<”に置き換えたのをブラウザが受け取りますが、ブラウザは”<”を”<”に変換しますので、入力されたデータがそのまま表示されることになります。
このテキストに記述しているサンプルはCGIを理解していただくためのものです。公開されるCGIには必ずいたずら防止などのチェック機能を組み込んでください。
www1の負荷軽減のため、2004年2月4日20時に次の変更がWebサーバApacheに対して行われました。 ApacheディレクティブHostnamelookups On → Offに変更 この結果、CGIプログラムに渡される環境変数REMOTE_HOSTが、下記のとおり変更となりました。
ホスト名があサイトからアクセスの時
従来 |
現在 |
|
| REMOTE_HOST | ホスト名 | "" |
| REMOTE_ADDR | IPアドレス | IPアドレス |
従来 |
現在 |
|
| REMOTE_HOST | ""
|
"" |
| REMOTE_ADDR | IPアドレス | IPアドレス |
ホスト名があるサイトからのアクセス、ホスト名がないサイトからのアクセス、どちらも環境変数 REMOTE_HOST には、ホスト名がセットされません。 フリーのCGIでは、通常下記のようにコーディングされており、問題ありませんが、ご使用のCGIのバージョンが古く下記と異なる場合は動作に支障が生じる可能性があります。その場合はCGIの新しいバージョンをご確認の上、更新してご利用ください。sub get_host {
$host = $ENV{'REMOTE_HOST'};
$addr = $ENV{'REMOTE_ADDR'};
if ($host eq "" || $host eq $addr) {
$host = gethostbyaddr(pack("C4", split(/\./, $addr)), 2) || $addr;
}
}
($host eq $addr)の部分は、Apacheの古い版では、ホスト名がないサイトからのアクセスのとき、REMOTE_HOST、REMOTE_ADDRのどちらにも、IPアドレスがセットされたという経緯があるためです。
- CGIプログラムの内容に関するお問い合わせはサポート対象外ですので、ご了承ください。
- WWWサーバの動作に影響を与えるようなプログラムを設置された場合には、弊社側でそのプログラムを強制的に停止させることもありますので、ご了承ください。
- お客様側の環境でバイナリのCGIプログラムを作成し、転送いただいても、サーバで動作する保障はありません。perl等のスクリプト言語で作成してください。
- お客様が作成されたCGIがエラーとなりますと、Internal Server Errorというエラーメッセージが表示されます。お客様のプログラム内容を再度確認いただき、デバッグしてください。