PerlのCGIプログラミング2024 年の最新の入門チュートリアル。このコースでは CGIとは何ですか,ウェブ閲覧,CGIチャート,Webサーバーの設定とサポート,HTTPヘッダー,CGI環境変数,ダウンロード,データを転送するGETメソッドを使用します。,データを渡すためにPOSTメソッドを使用します。,,CGIプログラムを介して無線データ転送,CGIプログラムを介してテキストエリアの転送データ,プルダウンを介してデータを渡すためのCGIプログラム,CGIはクッキーを使用されています,Cookieの設定,CGIモジュール, について学習できます。
次のように現在NCSAによって維持CGIは、NCSAのCGIが定義されています。
HTTPサーバ、同じHTMLページを提供するクライアント・インターフェース:のような、サーバー上で動作するプログラムであるCGI(Common Gateway Interface)を用い、共通ゲートウェイ・インターフェース、。
より良いCGIがどのように機能するかを理解するためには、プロセスのウェブページやURLのリンクをクリックすることができます:
CGIプログラムは、Pythonスクリプト、Perlスクリプト、シェルスクリプト、CまたはC ++プログラムすることができます。
あなたは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
我々は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>本教程(w3write.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の」を表示するためにブラウザに指示されています。
で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プログラムに重要な役割を果たし、次の環境変数を、受けています:
変数名 | 説明 |
---|---|
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、データ情報は、以下のように分割数のページ要求のURLに含まれています「?」:
http://www.test.com/cgi-bin/test.cgi?key1=value1&key2=value2他のコメントのいくつかについての要求をGET:
以下は、test.cgiプログラムに2つのパラメータを送信するためにGETメソッドを使用して、簡単なURLです。
/cgi-bin/test.cgi?name=本教程&url=http://www.w3write.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/%(ja)/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>本教程(w3write.com)</title>'; print "</head>"; print "<body>"; print "<h2>$name网址:$url</h2>"; print "</body>"; print "</html>"; 1;
次のようにブラウザをチェックし、出力結果は次のとおりです。
以下は、2 HTMLフォーム経由でGETメソッドを使用して、サーバーにデータを送信され、同じサーバースクリプトtest.cgiの文書を提出し、testというコードは次のとおりです。
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>本教程(w3write.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フォームデータを扱うことができ、また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/%(ja)/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>本教程(w3write.com)</title>'; print "</head>"; print "<body>"; print "<h2>$name网址:$url</h2>"; print "</body>"; print "</html>"; 1;
以下は、2 HTMLフォーム経由でGETメソッドを使用して、サーバーにデータを送信され、同じサーバースクリプトtest.cgiの文書を提出し、testというコードは次のとおりです。
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>本教程(w3write.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>
結果は以下の通りのブラウザの実装は次のとおりです。
以下のような1つ以上のオプションデータを送信するために使用されるチェックボックスは、testというコードは次のとおりです。
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>本教程(w3write.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/%(ja)/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>本教程(w3write.com)</title>'; print "</head>"; print "<body>"; print "<h2> 本教程选中状态 : $w3big_flag</h2>"; print "<h2> Google 选择状态 : $google_flag</h2>"; print "</body>"; print "</html>"; 1;
結果は以下の通りのブラウザの実装は次のとおりです。
以下のようにラジオが唯一のサーバにデータを転送し、testというコードは次のとおりです。
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>本教程(w3write.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/%(ja)/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>本教程(w3write.com)</title>'; print "</head>"; print "<body>"; print "<h2> 选择的网站 $site</h2>"; print "</body>"; print "</html>"; 1;
結果は以下の通りのブラウザの実装は次のとおりです。
テキストエリアには、次のようにtestというコードは、サーバーに複数行のデータを渡します。
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>本教程(w3write.com)</title> </head> <body> <form action="/cgi-bin/test.cgi" method="post" target="_blank"> <textarea name="textcontent" cols="40" rows="4"> 在这里输入内容ja. </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/%(ja)/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>本教程(w3write.com)</title>'; print "</head>"; print "<body>"; print "<h2>输入的文本内容为:$text_content</h2>"; print "</body>"; print "</html>"; 1;
結果は以下の通りのブラウザの実装は次のとおりです。
HTMLドロップダウンボックスのコードを次のように
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>本教程(w3write.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/%(ja)/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>本教程(w3write.com)</title>'; print "</head>"; print "<body>"; print "<h2>选择的网站是:$site</h2>"; print "</body>"; print "</html>"; 1;
結果は以下の通りのブラウザの実装は次のとおりです。
大きな欠点でHTTPプロトコルはプログラマに不便の多くを与えるユーザーのIDを、判断することが間違っているが、この不足のために作られたクッキーの機能を表示されます。
同一性を決定する機能を達成するように、クライアントのハードディスク上の顧客のブラウザを介して、顧客は、顧客は次のスクリプトを訪れたときにデータを取得し、データ・レコードを書き込むようにしながら、スクリプトにアクセスしているクッキーは、クッキーは、一般的に身元を検証する際に使用されます。
次のようにHTTPクッキーを達成するためにHTTPヘッダを介して送信され、彼はファイルを転送しなければならなかった、ヘッダのSet-Cookie構文は次のとおりです。
Set-cookie:name=name;expires=date;path=path;domain=domain;secure
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.w3write.com;\n"; print "Set-Cookie:Path=/perl;\n"; print "Content-type:text/html\r\n\r\n"; jajajajaja.其他 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
PerlのCGI多くの組み込みモジュールを提供するには、次の2を使用しました。