U-netSURF インターネットサービスプロバイダー

サイトマップ
U-netSURF(ユーネットサーフ)

ホームページサービス

FTPサーバ名がwww1ではじまるサイト向けCGIプログラムについて



CGIプログラムと記述言語について

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-bin.plについて

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について

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、nkfのパスは次のとおりです。

sendmail → /usr/lib/sendmail
nkf → /usr/local/bin/nkf

このページの先頭へ戻る


CGIプログラムの設置場所について

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プログラムの属性(パーミッション)について

CGIプログラムの属性(パーミッション)は、ftpソフトで実行可能(x)モードを追加してください(644から755にしてください)。

7: 「 オーナ」のパーミッションです。
5: 「グループ」のパーミッションです。
5: 「その他」のパーミッションです。

4bit: r 読み取り可
2bit: w 書き込み可
1bit: x 実行可

通常は、755にしますが、U-netSURFでは、CGIプログラムは「 オーナ」のパーミッションで実行されますので700に設定するのがベストです。「オーナ」のパーミッションは、アップロードのために、7でなければいけません。

このページの先頭へ戻る


CGIプログラムの呼び出しについて

"/cgi-bin/cgiwrap/~ユーザID/" の後に CGIプログラム名を指定します。
下記の掲示板のboard.cgiを呼び出すときは、次のようになります。

sample       (ホームディレクトリ)
 |- index.html
 |- cgi-bin    (cgi-binディレクトリ)
   |- board   (掲示板用ディレクトリ)
     |- board.cgi
     |- data  (データファイルのディレクトリ)
       |- board.dat

URLからCGIプログラムを直接指定する場合

  

http://www1.u-netsurf.ne.jp/cgi-bin/cgiwrap/~sample/board/board.cgi

フォームの ACTION から指定する場合

  

<FORM action="/cgi-bin/cgiwrap/~sample/board/board.cgi" method="POST">

HREF から指定する場合

  

<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"

このページの先頭へ戻る


フォームメールCGIプログラムについて

フォームから入力したデータを、漢字コード変換などを行ってからメールする場合のサンプルは以下のとおりです。
・[ send.html ]は、入力画面を生成しています。
・[ send.cgi ]は、send.htmlで作成した画面上で「送信」をクリックされたときに呼び出され、入力画面から受け取ったメッセージをsendmailコマンドでメールしています。

==== send.htmlファイル(入力用フォームの雛形)====
<FORM ACTION="/cgi-bin/cgiwrap/~ユーザID/send.cgi"...のユーザIDを変更してください。
<HTML>
<HEAD>
<META HTTP-EQUIV="content-type" CONTENT="text/html; charset=Shift_JIS">
<TITLE>電子メールの送信</TITLE>
</HEAD>
<BODY BGCOLOR="white" LINK=blue VLINK=blue>
<CENTER>
<FONT SIZE=4 COLOR=GREEN><B>
電子メールの送信
</B></FONT>
<FONT SIZE=3 COLOR=black>
<FORM ACTION="/cgi-bin/cgiwrap/~ユーザID/send.cgi" METHOD="POST">
<B>メールアドレス</B><BR>
<INPUT TYPE="text" NAME="email"
SIZE="30" MAXLENGTH="100">
<P>
<B>お名前</B><BR>
<INPUT TYPE="text" NAME="name"
SIZE="20" MAXLENGTH="50">
<P>
<B>メッセージ</B><BR>
<TEXTAREA NAME="message" ROWS="3"
COLS="50"></TEXTAREA>
<P>
<INPUT TYPE="submit" VALUE="送信">
<INPUT TYPE="reset" VALUE="取消">
</FORM>
<B>全項目の入力を確認して“送信”ボタンをクリック下さい。</B><BR>
</CENTER>
</BODY>
</HTML>
== send.cgiファイル(CGIプログラムの雛形,Shift_JISでアップロード)==
パソコンからの入力データのコードは、Shift_JISですから、jcode.plのconvertでコード変換 する必要はありません。
下記の$mailto = 'ユーザID@dp.u-netsurf.ne.jp'; は御自身のメールアドレスに変更ください。
ヒアドキュメント内のFrom:のメールアドレスも変更してください。
ヒアドキュメント内の文字列またはダブルクォート内の文字列に、@がある ときは、配列名でないことを示すために、\@とエスケープしてください。 #!/usr/local/bin/perl56
print "Content-type: text/html; charset=Shift_JIS\n\n";
require 'cgi-lib.pl';
require 'jcode.pl';
$nkf = "/usr/local/bin/nkf -j"; # nkfで JISコードへ変換。
#データの取出し
&ReadParse(*data);
$email = $data{'email'};
$name = $data{'name'};
$message = $data{'message'};
#メールの送信
$sendmail = "/usr/lib/sendmail";
$mailto = 'ユーザID@dp.u-netsurf.ne.jp';#ダブルクォートならば、"..\@dp.."となります。
open(MAIL,"| $nkf | $sendmail -t"); # -tは、To:で指定したところに送信します。
print MAIL <<"_EOF_";
From: ユーザID\@dp.u-netsurf.ne.jp
To:$mailto
Subject: a test mail
メールアドレス: $email
お名前: $name
メッセージ: $message
_EOF_
close (MAIL);
print <<"REPLY";
<HTML><HEAD><TITLE>メール送信</TITLE></HEAD><BODY>
ありがとう!<BR><BR>
メールアドレス: $email<BR>
お名前: $name<BR>
メッセージ: $message<BR>
</BODY></HTML>
REPLY
exit;

※1行目 #!/usr/local/bin/perl5 は「#!」で書き始めます。 コードのコピー&ペーストで左側に空白文字が入ったとき、削除してください。 ヒアドキュメントの終端文字列 _EOF_ の前後に空白文字を置かないようにしてください。

== send.cgiファイル(CGIプログラムの雛形,EUCでアップロード)== CGIプログラムをEUCでアップロードしますので、パソコンからの入力コードがShift_JISですから、EUCコードに変換する必要があります。
下記の$mailto = 'ユーザID@dp.u-netsurf.ne.jp'; は御自身のメールアドレスに変更ください。 ヒアドキュメント内のFrom:のメールアドレスも変更してください。
ヒアドキュメント内の文字列またはダブルクォート内の文字列に、@がある ときは、配列名でないことを示すために、\@とエスケープしてください。

#!/usr/local/bin/perl56
print "Content-type: text/html; charset=EUC-JP\n\n";
require 'cgi-lib.pl';
require 'jcode.pl';
$nkf = "/usr/local/bin/nkf -j"; # nkfで JISコードへ変換。
#データの取出し
&ReadParse(*data);
$email = $data{'email'};
$name = $data{'name'};
$message = $data{'message'};
&jcode'convert(*name,'euc');??? # EUCコードに変換。 &jcode'convert(*message,'euc'); # EUCコードに変換。
#メールの送信 $sendmail = "/usr/lib/sendmail";
$mailto = 'ユーザID@dp.u-netsurf.ne.jp';#ダブルクォートならば、"..\@dp.."となります。
open(MAIL,"| $nkf | $sendmail -t"); # -tは、To:で指定したところに送信します。
print MAIL <<"_EOF_";
From: ユーザID\@dp.u-netsurf.ne.jp
To:$mailto
Subject: a test mail
メールアドレス: $email
お名前: $name
メッセージ: $message
_EOF_
close (MAIL);
print <<"REPLY";
<HTML><HEAD><TITLE>メール送信</TITLE></HEAD><BODY> ありがとう!<BR><BR> メールアドレス: $email<BR> お名前: $name<BR> メッセージ: $message<BR>
</BODY></HTML>
REPLY
exit;

1行目 #!/usr/local/bin/perl5 は「#!」で書き始めます。 コードのコピー&ペーストで左側に空白文字が入ったとき、削除してください。 ヒアドキュメントの終端文字列 _EOF_ の前後に空白文字を置かないようにしてください。

sendmailについての説明  

 

入力データの取り出し方(入力データのデコード)について
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

ファイルをWebサーバにアップロード 

例:ホームページのディレクトリ構造と各ファイルが以下の場合(ユーザ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/</&lt;/g;#<<< 追加。タグ禁止。

”<”の文字を”&lt;”に置き換えたのをブラウザが受け取りますが、ブラウザは”&lt;”を”<”に変換しますので、入力されたデータがそのまま表示されることになります。

このテキストに記述しているサンプルはCGIを理解していただくためのものです。公開されるCGIには必ずいたずら防止などのチェック機能を組み込んでください。

このページの先頭へ戻る


環境変数REMOTE_HOSTについて

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ご利用にあたってのご注意(下記事項をご了承の上、ご利用ください)

  • CGIプログラムの内容に関するお問い合わせはサポート対象外ですので、ご了承ください。
  • WWWサーバの動作に影響を与えるようなプログラムを設置された場合には、弊社側でそのプログラムを強制的に停止させることもありますので、ご了承ください。
  • お客様側の環境でバイナリのCGIプログラムを作成し、転送いただいても、サーバで動作する保障はありません。perl等のスクリプト言語で作成してください。
  • お客様が作成されたCGIがエラーとなりますと、Internal Server Errorというエラーメッセージが表示されます。お客様のプログラム内容を再度確認いただき、デバッグしてください。
このページの先頭へ戻る