Latest web development tutorials

PerlのCGIプログラミング

CGIとは何ですか

次のように現在NCSAによって維持CGIは、NCSAのCGIが定義されています。

HTTPサーバ、同じHTMLページを提供するクライアント・インターフェース:のような、サーバー上で動作するプログラムであるCGI(Common Gateway Interface)を用い、共通ゲートウェイ・インターフェース、。


ウェブ閲覧

より良いCGIがどのように機能するかを理解するためには、プロセスのウェブページやURLのリンクをクリックすることができます:

  • 1、URLにアクセスして、HTTP Webサーバーに接続するには、ブラウザを使用しています。
  • 2、Webサーバは要求メッセージがURLを解析され、ファイルの内容を返すことがある場合、存在する場合、サーバー上でアクセスされたファイルを見て、それ以外の場合はエラーメッセージを返しますされます受け取ります。
  • 図3に示すように、ブラウザがサーバから情報を受信し、受信したファイルまたはエラーメッセージを表示します。

CGIプログラムは、Pythonスクリプト、Perlスクリプト、シェルスクリプト、CまたはC ++プログラムすることができます。


CGIチャート

cgiarch


Webサーバーの設定とサポート

あなたはCGIプログラミングを行う前に、ご使用のWebサーバーがCGIやCGIハンドラをサポートするように構成されていることを確認してください。

ApacheはCGIの設定をサポートしています。

CGIディレクトリを設定します。

ScriptAlias /cgi-bin/ /var/www/cgi-bin/

CGIプログラムを実行するすべてのHTTPサーバは、予め設定されたディレクトリに格納されています。 このディレクトリには、CGIディレクトリと呼ばれ、慣習によって、それは、/ var / www /のcgi-binディレクトリという名前です。

CGIファイル拡張子.cgiの、Perlはまた、拡張子.plを使用することができます。

デフォルトでは、のcgi-binディレクトリを実行するLinuxサーバーの設定は、は/ var / WWWのです。

あなたはCGIスクリプトを実行するために別のディレクトリを指定したい場合は、次のようにhttpd.confの設定ファイルを変更することができます。

<Directory "/var/www/cgi-bin">
   AllowOverride None
   Options +ExecCGI
   Order allow,deny
   Allow from all
</Directory>

AddHandlerは.PLサフィックスを追加しますので、我々は.plというPerlスクリプトファイルの末尾にアクセスできます。

AddHandler cgi-script .cgi .pl .py

最初のCGIプログラム

我々はtest.cgiファイルを作成するには、以下の以下のように、コードは次のとおりです。

#!/usr/bin/perl

print "Content-type:text/html\r\n\r\n";
print '<html>';
print '<head>';
print '<meta charset="utf-8">';
print '<title>本教程(w3big.com)</title>';
print '</head>';
print '<body>';
print '<h2>Hello Word! </h2>';
print '<p>来自本教程第一个 CGI 程序。</p>';
print '</body>';
print '</html>';

1;

次に、ブラウザでhttpを開き、次のように//localhost/cgi-bin/test.cgi、出力結果は次のとおりです。

スクリプトの最初の行の出力「コンテンツタイプ:text / htmlの\ rを\ nは\ rを\ n "は、ブラウザに送信され、コンテンツタイプ" text / htmlの」を表示するためにブラウザに指示されています。


HTTPヘッダー

でtest.cgiファイルの内容:HTTPヘッダの一部「コンテンツタイプtext / htmlの "ですが、それはブラウザのコンテンツタイプに送信されますブラウザのファイルを指示します。

次のようにHTTPヘッダーの形式は次のとおりです。

HTTP 字段名: 字段内容

例えば:

Content-type:text/html\r\n\r\n

次の表は、HTTPヘッダーのCGIプログラムの情報が頻繁に使用されて説明します。

ヘッド 説明
コンテンツタイプ: 情報要求に対応するMIMEエンティティ。 たとえば、次のようにコンテンツタイプ:text / htmlの
有効期限:日 回答日時の期限が切れ
場所:URL 新しいリソースの要求または識別を完了するために、非場所のURL要求に受信者をリダイレクトするには
最終更新:日 要求されたリソースが最後に変更されました
コンテンツの長さ:N Content-Length要求
Set-Cookieを:文字列 HTTPクッキーの設定

CGI環境変数

すべてのCGIプログラムはCGIプログラムに重要な役割を果たし、次の環境変数を、受けています:

変数名 説明
CONTENT_TYPE この値は、情報転送のMIMEタイプに、その環境変数を示します。 現在では、環境変数は、一般的にCONTENT_TYPEです:アプリケーション/ x-www-form-urlencodedで、彼は、HTMLフォームからのデータと述べました。
CONTENT_LENGTH 転送モードサーバとCGIプログラム情報は、POSTの場合たとえ環境変数STDIN入力標準から有効なデータを読み込むことができるバイト数。 入力データを読み込むこの環境変数を使用する必要があります。
HTTP_COOKIE クライアント内COOKIEコンテンツ。
HTTP_USER_AGENT 情報を提供することは、クライアントのブラウザまたは他の独自のデータのバージョン番号が含まれています。
PATH_INFO この環境変数の値は、すぐに追加のパス情報の後にCGIプログラムの名前を示します。 これは、多くの場合、引数のCGIプログラムとして表示されます。
QUERY_STRING 転送モードサーバとCGIプログラムの情報は、情報である場合に渡された場合でも、この環境変数の値を取得します。 この情報は、両方の疑問符「?」セパレーターと途中で、CGIプログラムの名前が続きます。
REMOTE_ADDR この環境変数の値は、クライアントのIPアドレスは、例えば、上記の192.168.1.67の要求を送信します。 この値は常に存在しています。 Webサーバの一意の識別子をWebクライアントを提供する必要性が異なるWebクライアントを区別するためにCGIプログラムで使用することができるされています。
REMOTE_HOST この環境変数の値は、CGIの要求しているクライアントのホスト名が含まれています。 それはあなたがチェックしたくない場合は、この環境変数を定義する必要はありません。
REQUEST_METHOD これは、スクリプトと呼ばれる方法を提供します。 HTTP / 1.0プロトコルのスクリプトについてのみGETとPOST有意義。
SCRIPT_FILENAME CGIスクリプトへのフルパス
SCRIPT_NAME CGIスクリプトの名前
SERVER_NAME これは、Webサーバーのホスト名、エイリアス、またはIPアドレスです。
SERVER_SOFTWARE この環境変数の値は、HTTPサーバーのコールCGIプログラム名とバージョン番号が含まれています。 例えば、Apacheの/ 2.2.14(Unixの)の上の値

ここでは、簡単なCGIスクリプトの出力CGI環境変数は次のとおりです。

#!/usr/bin/perl

print "Content-type: text/html\n\n";
print '<meta charset="utf-8">';
print "<font size=+1>环境变量:</font>\n";
foreach (sort keys %ENV)
{
  print "<b>$_</b>: $ENV{$_}<br>\n";
}

1;

ダウンロード

我々はPerlのCGIファイルのダウンロードを通じて実現したい場合は、次のように、ヘッダ情報の異なるセットが必要です。

#!/usr/bin/perl

# HTTP Header
print "Content-Type:application/octet-stream; name=\"FileName\"\r\n";
print "Content-Disposition: attachment; filename=\"FileName\"\r\n\n";

# Actual File Content will go hear.
open( FILE, "<FileName" );
while(read(FILE, $buffer, 100) )
{
   print("$buffer");
}

データを転送するGETメソッドを使用します。

サーバに符号化されたユーザ情報を送信する方法をGET、データ情報は、以下のように分割数のページ要求のURLに含まれています「?」:

http://www.test.com/cgi-bin/test.cgi?key1=value1&key2=value2
他のコメントのいくつかについての要求をGET:
  • GETリクエストをキャッシュすることができます
  • GETリクエストは、ブラウザの履歴に残ります
  • 要求はブックマークが可能GET
  • 機密データを扱う際の要求は使用すべきではありませんGET
  • GETリクエストは、長さの制限を持っています
  • 要求は、データを取得するために使用されるべきでGET

簡単なURLの例:GETメソッド

以下は、test.cgiプログラムに2つのパラメータを送信するためにGETメソッドを使用して、簡単なURLです。

/cgi-bin/test.cgi?name=本教程&url=http://www.w3big.com

コードtest.cgiファイル:

#!/usr/bin/perl

local ($buffer, @pairs, $pair, $name, $value, %FORM);
# 读取文本信息
$ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/;
if ($ENV{'REQUEST_METHOD'} eq "GET")
{
   $buffer = $ENV{'QUERY_STRING'};
}
# 读取 name/value 对信息
@pairs = split(/&/, $buffer);
foreach $pair (@pairs)
{
   ($name, $value) = split(/=/, $pair);
   $value =~ tr/+/ /;
   $value =~ s/%(..)/pack("C", hex($1))/eg;
   $FORM{$name} = $value;
}
$name = $FORM{name};
$url  = $FORM{url};

print "Content-type:text/html\r\n\r\n";
print "<html>";
print "<head>";
print '<meta charset="utf-8">';
print '<title>本教程(w3big.com)</title>';
print "</head>";
print "<body>";
print "<h2>$name网址:$url</h2>";
print "</body>";
print "</html>";

1;

次のようにブラウザをチェックし、出力結果は次のとおりです。

単純な形式の例:GETメソッド

以下は、2 HTMLフォーム経由でGETメソッドを使用して、サーバーにデータを送信され、同じサーバースクリプトtest.cgiの文書を提出し、test.htmlというコードは次のとおりです。

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>本教程(w3big.com)</title>
</head>
<body>
<form action="/cgi-bin/test.cgi" method="get">
站点名称: <input type="text" name="name">  <br />

站点 URL: <input type="text" name="url" />
<input type="submit" value="提交" />
</form>
</body>
</html>

結果は以下の通りのブラウザの実装は次のとおりです。


データを渡すためにPOSTメソッドを使用します。

そのようなユーザパスワードなどのいくつかの機密情報は、データを転送するためにPOSTを使用する必要があり、サーバにデータを渡すためにPOSTメソッドを使用すると、より安全で信頼性が高いです。

以下は、それはまた、ブラウザから提出されたPOSTフォームデータを扱うことができ、またtest.cgiです。

#!/usr/bin/perl

local ($buffer, @pairs, $pair, $name, $value, %FORM);
# 读取文本信息
$ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/;
if ($ENV{'REQUEST_METHOD'} eq "POST")
{
   read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
}else {
   $buffer = $ENV{'QUERY_STRING'};
}
# 读取 name/value 对信息
@pairs = split(/&/, $buffer);
foreach $pair (@pairs)
{
   ($name, $value) = split(/=/, $pair);
   $value =~ tr/+/ /;
   $value =~ s/%(..)/pack("C", hex($1))/eg;
   $FORM{$name} = $value;
}
$name = $FORM{name};
$url  = $FORM{url};

print "Content-type:text/html\r\n\r\n";
print "<html>";
print "<head>";
print '<meta charset="utf-8">';
print '<title>本教程(w3big.com)</title>';
print "</head>";
print "<body>";
print "<h2>$name网址:$url</h2>";
print "</body>";
print "</html>";

1;

以下は、2 HTMLフォーム経由でGETメソッドを使用して、サーバーにデータを送信され、同じサーバースクリプトtest.cgiの文書を提出し、test.htmlというコードは次のとおりです。

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>本教程(w3big.com)</title>
</head>
<body>
<form action="/cgi-bin/test.cgi" method="post">
站点名称: <input type="text" name="name">  <br />

站点 URL: <input type="text" name="url" />
<input type="submit" value="提交" />
</form>
</body>
</html>

結果は以下の通りのブラウザの実装は次のとおりです。

チェックボックスを介してデータを渡すためのCGIプログラム

以下のような1つ以上のオプションデータを送信するために使用されるチェックボックスは、test.htmlというコードは次のとおりです。

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>本教程(w3big.com)</title>
</head>
<body>
<form action="/cgi-bin/test.cgi" method="POST" target="_blank">
<input type="checkbox" name="w3big" value="on" /> 本教程
<input type="checkbox" name="google" value="on" /> Google
<input type="submit" value="选择站点" />
</form>
</body>
</html>

コードtest.cgiファイル:

#!/usr/bin/perl

local ($buffer, @pairs, $pair, $name, $value, %FORM);
# 读取信息
$ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/;
if ($ENV{'REQUEST_METHOD'} eq "POST")
{
   read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
}else {
   $buffer = $ENV{'QUERY_STRING'};
}
# 读取 name/value 对信息
@pairs = split(/&/, $buffer);
foreach $pair (@pairs)
{
   ($name, $value) = split(/=/, $pair);
   $value =~ tr/+/ /;
   $value =~ s/%(..)/pack("C", hex($1))/eg;
   $FORM{$name} = $value;
}
if( $FORM{w3big} ){
   $w3big_flag ="ON";
}else{
   $w3big_flag ="OFF";
}
if( $FORM{google} ){
   $google_flag ="ON";
}else{
   $google_flag ="OFF";
}

print "Content-type:text/html\r\n\r\n";
print "<html>";
print "<head>";
print '<meta charset="utf-8">';
print '<title>本教程(w3big.com)</title>';
print "</head>";
print "<body>";
print "<h2> 本教程选中状态 : $w3big_flag</h2>";
print "<h2> Google 选择状态 : $google_flag</h2>";
print "</body>";
print "</html>";

1;

結果は以下の通りのブラウザの実装は次のとおりです。


CGIプログラムを介して無線データ転送

以下のようにラジオが唯一のサーバにデータを転送し、test.htmlというコードは次のとおりです。

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>本教程(w3big.com)</title>
</head>
<body>
<form action="/cgi-bin/test.cgi" method="post" target="_blank">
<input type="radio" name="site" value="w3big" /> 本教程
<input type="radio" name="site" value="google" /> Google
<input type="submit" value="提交" />
</form>
</body>
</html>

test.cgiのスクリプトコードは次のとおりです。

#!/usr/bin/perl

local ($buffer, @pairs, $pair, $name, $value, %FORM);
# 读取信息
$ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/;
if ($ENV{'REQUEST_METHOD'} eq "POST")
{
   read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
}else {
   $buffer = $ENV{'QUERY_STRING'};
}
# 读取 name/value 对信息
@pairs = split(/&/, $buffer);
foreach $pair (@pairs)
{
   ($name, $value) = split(/=/, $pair);
   $value =~ tr/+/ /;
   $value =~ s/%(..)/pack("C", hex($1))/eg;
   $FORM{$name} = $value;
}
$site = $FORM{site};

print "Content-type:text/html\r\n\r\n";
print "<html>";
print "<head>";
print '<meta charset="utf-8">';
print '<title>本教程(w3big.com)</title>';
print "</head>";
print "<body>";
print "<h2> 选择的网站 $site</h2>";
print "</body>";
print "</html>";

1;

結果は以下の通りのブラウザの実装は次のとおりです。


CGIプログラムを介してテキストエリアの転送データ

テキストエリアには、次のようにtest.htmlというコードは、サーバーに複数行のデータを渡します。

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>本教程(w3big.com)</title>
</head>
<body>
<form action="/cgi-bin/test.cgi" method="post" target="_blank">
<textarea name="textcontent" cols="40" rows="4">
在这里输入内容...
</textarea>
<input type="submit" value="提交" />
</form>
</body>
</html>

test.cgiのスクリプトコードは次のとおりです。

#!/usr/bin/perl

local ($buffer, @pairs, $pair, $name, $value, %FORM);
# 读取信息
$ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/;
if ($ENV{'REQUEST_METHOD'} eq "POST")
{
   read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
}else {
   $buffer = $ENV{'QUERY_STRING'};
}
# 读取 name/value 对信息
@pairs = split(/&/, $buffer);
foreach $pair (@pairs)
{
   ($name, $value) = split(/=/, $pair);
   $value =~ tr/+/ /;
   $value =~ s/%(..)/pack("C", hex($1))/eg;
   $FORM{$name} = $value;
}
$text_content = $FORM{textcontent};

print "Content-type:text/html\r\n\r\n";
print "<html>";
print "<head>";
print '<meta charset="utf-8">';
print '<title>本教程(w3big.com)</title>';
print "</head>";
print "<body>";
print "<h2>输入的文本内容为:$text_content</h2>";
print "</body>";
print "</html>";

1;

結果は以下の通りのブラウザの実装は次のとおりです。


プルダウンを介してデータを渡すためのCGIプログラム

HTMLドロップダウンボックスのコードを次のように

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>本教程(w3big.com)</title>
</head>
<body>
<form action="/cgi-bin/test.cgi" method="post" target="_blank">
<select name="dropdown">
<option value="w3big" selected>本教程</option>
<option value="google">Google</option>
</select>
<input type="submit" value="提交"/>
</form>
</body>
</html>

test.cgiスクリプトコードを次のように

#!/usr/bin/perl

local ($buffer, @pairs, $pair, $name, $value, %FORM);
# 读取信息
$ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/;
if ($ENV{'REQUEST_METHOD'} eq "POST")
{
   read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
}else {
   $buffer = $ENV{'QUERY_STRING'};
}
# 读取 name/value 对信息
@pairs = split(/&/, $buffer);
foreach $pair (@pairs)
{
   ($name, $value) = split(/=/, $pair);
   $value =~ tr/+/ /;
   $value =~ s/%(..)/pack("C", hex($1))/eg;
   $FORM{$name} = $value;
}
$site = $FORM{dropdown};

print "Content-type:text/html\r\n\r\n";
print "<html>";
print "<head>";
print '<meta charset="utf-8">';
print '<title>本教程(w3big.com)</title>';
print "</head>";
print "<body>";
print "<h2>选择的网站是:$site</h2>";
print "</body>";
print "</html>";

1;

結果は以下の通りのブラウザの実装は次のとおりです。


CGIはクッキーを使用されています

大きな欠点でHTTPプロトコルはプログラマに不便の多くを与えるユーザーのIDを、判断することが間違っているが、この不足のために作られたクッキーの機能を表示されます。

同一性を決定する機能を達成するように、クライアントのハードディスク上の顧客のブラウザを介して、顧客は、顧客は次のスクリプトを訪れたときにデータを取得し、データ・レコードを書き込むようにしながら、スクリプトにアクセスしているクッキーは、クッキーは、一般的に身元を検証する際に使用されます。

クッキーの構文

次のようにHTTPクッキーを達成するためにHTTPヘッダを介して送信され、彼はファイルを転送しなければならなかった、ヘッダのSet-Cookie構文は次のとおりです。

Set-cookie:name=name;expires=date;path=path;domain=domain;secure 
  • 複数名の値があります;("、"数名を使用することはできません"")、クッキーの値を設定する「;」は、 例えば 、分離する::名=名 NAME1 = NAME1; NAME2 = NAME2 ; NAME3 = NAME3。
  • 有効期限が切れる=日付:形式でクッキーの有効期限を:= "WDY、DD-期限が切れる:MM:SS月-YYYYのHHを"
  • パス=パス:パスがCookieサポートを設定し、パスがパスである場合、例えば力へのディレクトリエントリのすべてのファイルとサブディレクトリのCookie、:パス= "/のcgi-bin /"、パスがファイルである場合には、クッキーそれは例えば、このファイルの発効を指します。path = "/のcgi-bin / cookie.cgi」。
  • ドメイン=ドメイン:クッキーのドメイン名が有効で、例えば:ドメイン= "www.w3big.com"
  • 固定:このフラグが指定された場合、クッキーが唯一のSSLプロトコルHTTPSサーバを介して送信することができます。
  • クッキーは、クッキーの変数を検索して情報を取得することができ、環境変数HTTP_COOKIE達成CGIプログラムを設定することによって受信されます。

Cookieの設定

Cookieの設定CookieはHTTPヘッダで別々に送信され、非常に簡単です。 次の例では、ユーザID、パスワードを設定し、クッキーの有効期限:

#!/usr/bin/perl

print "Set-Cookie:UserID=XYZ;\n";
print "Set-Cookie:Password=XYZ123;\n";
print "Set-Cookie:Expires=Tuesday, 31-Dec-2017 23:12:40 GMT";\n";
print "Set-Cookie:Domain=www.w3big.com;\n";
print "Set-Cookie:Path=/perl;\n";
print "Content-type:text/html\r\n\r\n";
...........其他 HTML 内容

クッキーを探します

クッキー情報検索ページでは、Cookie情報が格納されている次のようにCGI環境変数HTTP_COOKIEに、ストレージ・フォーマットは、非常に簡単です:

#!/usr/bin/perl
$rcvd_cookies = $ENV{'HTTP_COOKIE'};
@cookies = split /;/, $rcvd_cookies;
foreach $cookie ( @cookies ){
   ($key, $val) = split(/=/, $cookie); # splits on the first =.
   $key =~ s/^\s+//;
   $val =~ s/^\s+//;
   $key =~ s/\s+$//;
   $val =~ s/\s+$//;
   if( $key eq "UserID" ){
      $user_id = $val;
   }elsif($key eq "Password"){
      $password = $val;
   }
}
print "User ID  = $user_id\n";
print "Password = $password\n";

上の例の出力は、次のとおりです。

User ID = XYZ
Password = XYZ123

CGIモジュール

PerlのCGI多くの組み込みモジュールを提供するには、次の2を使用しました。