CGIとは
CGI は現在 NCSA によって保守されており、NCSA は CGI を次のように定義しています。
CGI(Common Gateway Interface)、Common Gateway Interface は、HTTP サーバーなどのサーバー上で動作し、クライアントの HTML ページとのインターフェイスを提供するプログラムです。
ウェブブラウジング
CGI がどのように機能するかをよりよく理解するには、Web ページ上のリンクまたは URL をクリックするプロセスから始めることができます。
1. ブラウザを使用して URL にアクセスし、HTTP Web サーバーに接続します。
2. リクエスト情報を受信した後、Web サーバーは URL を解析し、アクセスされたファイルがサーバー上に存在するかどうかを確認し、ファイルが存在する場合はファイルの内容を返し、存在しない場合はエラー メッセージを返します。
3. ブラウザはサーバーから情報を受信し、受信したファイルやエラーメッセージを表示します。
CGI プログラムには、Python スクリプト、PERL スクリプト、SHELL スクリプト、C または C++ プログラムなどがあります。
CGI アーキテクチャ図
Web サーバーのサポートと構成
CGI プログラミングを実行する前に、Web サーバーが CGI をサポートし、CGI ハンドラーが構成されていることを確認してください。
Apache は CGI 構成をサポートします。
CGI ディレクトリを設定します。
ScriptAlias /cgi-bin/ /var/www/cgi-bin/
すべての HTTP サーバー実行 CGI プログラムは、事前設定されたディレクトリに保存されます。このディレクトリは CGI ディレクトリと呼ばれ、慣例により /var/www/cgi-bin という名前が付けられます。
CGI ファイルには .cgi 拡張子が付いていますが、Perl では .pl 拡張子も使用できます。
デフォルトでは、Linux サーバー構成は /var/www の cgi-bin ディレクトリで実行されます。
CGI スクリプトを実行する別のディレクトリを指定する場合は、次のように httpd.conf 構成ファイルを変更できます。
<ディレクトリ "/var/www/cgi-bin">AllowOverride なし オプション +ExecCGI 順序 許可、拒否 すべてから許可</Directory>
.pl で終わる Perl スクリプト ファイルにアクセスできるように、AddHandler に .pl サフィックスを追加します。
AddHandler cgi-script .cgi .pl .py
最初の CGI プログラム
以下で test.cgi ファイルを作成します。コードは次のとおりです。
test.cgi コード
#!/usr/bin/perl 印刷する"コンテンツ タイプ:text/html r n r n " ; ' <html> ' ; ' <ヘッド> ' ; ' <meta
charset ="utf-8"> ' ; ' <title>コーダー チュートリアル (codercto.com) </title> ' ; ' </head> ' ; ' <本文> ' ; ' <h2>こんにちは</h2> ' ; ' <p>プログラマーズ チュートリアルの最初の CGI プログラム。 </p> ' ; ' </body> ' ; ' </html> ' ;次に、ブラウザで http://localhost/cgi-bin/test.cgi を開くと、出力結果は次のようになります。
スクリプト「Content-type: text/htmlrnrn」の最初の行の出力コンテンツがブラウザに送信され、表示されるコンテンツ タイプが「text/html」であることがブラウザに伝えられます。
HTTPヘッダー
test.cgi ファイルのコンテンツ内の「Content-type:text/html」は HTTP ヘッダーの一部であり、ファイルのコンテンツ タイプをブラウザーに伝えるためにブラウザーに送信されます。
HTTP ヘッダーの形式は次のとおりです。
HTTP フィールド名: フィールドの内容
例えば:
コンテンツ タイプ:text/htmlrnrn
次の表は、CGI プログラムの HTTP ヘッダーで一般的に使用される情報を示しています。
頭 | 説明する |
---|
コンテンツタイプ: | エンティティに対応する要求された MIME 情報。例: Content-type:text/html |
有効期限: 日付 | 応答の有効期限日時 |
場所: URL | リクエストを完了するか新しいリソースを識別するために、受信者をリクエストされていない URL の場所にリダイレクトするために使用されます。 |
最終更新日: 日付 | リクエストされたリソースの最終変更時刻 |
コンテンツの長さ: N | 要求されたコンテンツの長さ |
セットクッキー: 文字列 | HTTP Cookie を設定する |
CGI 環境変数
すべての CGI プログラムは次の環境変数を受け取ります。これらは CGI プログラムで重要な役割を果たします。
変数名 | 説明する |
---|
コンテンツタイプ | この環境変数の値は、渡される情報の MIME タイプを示します。現在、環境変数 CONTENT_TYPE は通常、application/x-www-form-urlencoded であり、データが HTML フォームから取得されることを示します。 |
CONTENT_LENGTH | サーバと CGI プログラム間の情報転送方式が POST の場合、この環境変数は標準入力 STDIN から読み込める有効なデータのバイト数になります。この環境変数は、入力されたデータを読み取るときに使用する必要があります。 |
HTTP_COOKIE | クライアント内の COOKIE コンテンツ。 |
HTTP_USER_AGENT | バージョン番号やその他の独自データを含む顧客のブラウザ情報を提供します。 |
PATH_INFO | この環境変数の値は、CGI プログラム名の直後に続く他のパス情報を表します。多くの場合、CGI プログラムのパラメータとして表示されます。 |
QUERY_STRING | サーバと CGI プログラム間の情報転送方式が GET の場合、この環境変数の値が転送される情報となります。この情報は、CGI プログラム名の後に疑問符「?」で区切って続きます。 |
REMOTE_ADDR | この環境変数の値は、リクエストを送信するクライアントの IP アドレス (上記の 192.168.1.67 など) です。この値は常に存在します。これは、Web クライアントが Web サーバーに提供する必要がある一意の識別子であり、CGI プログラムでさまざまな Web クライアントを区別するために使用できます。 |
REMOTE_HOST | この環境変数の値には、CGI リクエストを送信したクライアントのホスト名が含まれます。クエリしたいクエリがサポートされていない場合、この環境変数を定義する必要はありません。 |
REQUEST_METHOD | スクリプトを呼び出すメソッドを提供します。 HTTP/1.0 プロトコルを使用するスクリプトの場合、GET と POST のみが意味を持ちます。 |
SCRIPT_FILENAME | CGI スクリプトへのフルパス |
SCRIPT_NAME | CGIスクリプトの名前 |
SERVER_NAME | これは、WEB サーバーのホスト名、エイリアス、または IP アドレスです。 |
サーバー_ソフトウェア | この環境変数の値には、CGI プログラムを呼び出す HTTP サーバーの名前とバージョン番号が含まれます。たとえば、上記の値は Apache/2.2.14(Unix) です。 |
以下は、CGI 環境変数を出力する単純な CGI スクリプトです。
例
#!/usr/bin/perl 印刷する"コンテンツ タイプ: text/html n n " ; ' <meta
charset ="utf-8"> ' ; " <font size=+1>環境変数:</font> n " ; (選別キー%ENV ) { 印刷する" <b> $_ </b>: $ENV { $_ } <br> n " } 1 ;ファイルのダウンロード
Perl CGI 経由でファイルをダウンロードする場合は、以下に示すように、別のヘッダー情報を設定する必要があります。
例
#!/usr/bin/perl # HTTPヘッダー印刷する" Content-Type:application/octet-stream; name= " FileName " r n " ; " Content-Disposition:attachment; filename= " FileName " r n n " ; # 実際のファイルの内容が聞き出されます。開ける(ファイル、 「 <ファイル名」 ) ; while (読み取り( 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 メソッド
以下は、GET メソッドを使用して 2 つのパラメーターを test.cgi プログラムに送信する単純な URL です。
/cgi-bin/test.cgi?name=コーダー チュートリアル&url=http://www.codercto.com
以下は、test.cgi ファイルのコードです。
例
#!/usr/bin/perl 地元( $buffer , @pairs , $pair , $name , $value , %FORM ) ; # テキスト情報を読み取る$ENV { ' REQUEST_METHOD ' } = ~ tr / a - z / A - Z /; ( $ENV { ' REQUEST_METHOD ' }等価"得る" ) { $ buffer = $ENV { ' QUERY_STRING ' } ; # 名前と値のペア情報を読み取る@pairs =分割( /&/, $ buffer ) ; $ペア( @ペア) { ( $name , $value ) = split ( /=/, $pair ) ; $value =~ tr /+/ / ; $value =~ s / % ( .. ) / Pack ( " C " , hex ( $1 ) ) /例; $FORM { $name } = $ value ; $name = $FORM {名前} ; $url = $ FORM { URL } ; "コンテンツ タイプ:text/html r n r n " ; " <html> " ; " <head> " ; ' <meta
charset ="utf-8"> ' ; ' <title>コーダー チュートリアル (codercto.com) </title> ' ; " </head> " ; " <本文> " ; " <h2> $name URL : $url </h2> " ; " </body> " ; " </html> " ;ブラウザを確認すると、出力は次のようになります。
単純なフォームの例: GET メソッド
以下は、GET メソッドを使用して 2 つのデータをサーバーに送信する HTML フォームです。送信されたサーバー スクリプトも test.html コードです。
test.html ファイルのコード
< ! html > <html> <頭> <メタ文字セット= " utf-8 " > <title>コーダーチュートリアル( codercto.com ) </title> </頭> <本文> <フォームアクション= " /cgi-bin/test.cgi "メソッド= " get " >サイト名: <入力type = "テキスト"名前= "名前" > < br />サイト URL: <入力type = "テキスト"名前= " URL " /> <入力type = "送信"値= "送信" /> </form> </body> </html>ブラウザでの実行効果は次のとおりです。
POSTメソッドを使用してデータを渡す
POST メソッドを使用してサーバーにデータを送信する方が、より安全で信頼性が高くなります。ユーザー パスワードなどの一部の機密情報は、データの送信に POST を使用する必要があります。
以下も test.cgi で、ブラウザーから送信された POST フォーム データを処理することもできます。
test.cgi コード
#!/usr/bin/perl 地元( $buffer , @pairs , $pair , $name , $value , %FORM ) ; # テキスト情報を読み取る$ENV { ' REQUEST_METHOD ' } = ~ tr / a - z / A - Z /; ( $ENV { ' REQUEST_METHOD ' }等価"役職" ) { read ( STDIN , $ buffer , $ ENV { ' CONTENT_LENGTH ' } ) ; { $ buffer = $ENV { ' QUERY_STRING ' } ; # 名前と値のペア情報を読み取る@pairs =分割( /&/, $ buffer ) ; $ペア( @ペア) { ( $name , $value ) = split ( /=/, $pair ) ; $value =~ tr /+/ / ; $value =~ s / % ( .. ) / Pack ( " C " , hex ( $1 ) ) /例; $FORM { $name } = $ value ; $name = $FORM {名前} ; $url = $ FORM { URL } ; "コンテンツ タイプ:text/html r n r n " ; " <html> " ; " <head> " ; ' <meta
charset ="utf-8"> ' ; ' <title>コーダー チュートリアル (codercto.com) </title> ' ; " </head> " ; " <本文> " ; " <h2> $name URL : $url </h2> " ; " </body> " ; " </html> " ;以下は、GET メソッドを使用して 2 つのデータをサーバーに送信する HTML フォームです。送信されたサーバー スクリプトも test.html コードです。
test.htmlコード
< ! html > <html> <頭> <メタ文字セット= " utf-8 " > <title>コーダーチュートリアル( codercto.com ) </title> </頭> <本文> <フォームアクション= " /cgi-bin/test.cgi "メソッド= "投稿" >サイト名: <入力type = "テキスト"名前= "名前" > < br />サイト URL: <入力type = "テキスト"名前= " URL " /> <入力type = "送信"値= "送信" /> </form> </body> </html>ブラウザでの実行効果は次のとおりです。
チェックボックス データを CGI プログラムに渡す
チェックボックスは、1 つ以上のオプション データを送信するために使用されます。test.html コードは次のとおりです。
test.htmlコード
< ! html > <html> <頭> <メタ文字セット= " utf-8 " > <title>コーダーチュートリアル( codercto.com ) </title> </頭> <本文> <フォームアクション= " /cgi-bin/test.cgi "メソッド= " POST "ターゲット= " _blank " > <入力type = "チェックボックス"名前= " codercto "値= "オン" /> Coder チュートリアル< input type = "チェックボックス"名前= "グーグル"値= "オン" /> Google <入力type = "送信"値= "サイトを選択" /> </form> </body> </html>以下は、test.cgi ファイルのコードです。
test.cgi コード
#!/usr/bin/perl 地元( $buffer , @pairs , $pair , $name , $value , %FORM ) ; # 情報を読み取る$ENV { ' REQUEST_METHOD ' } = ~ tr / a - z / A - Z /; ( $ENV { ' REQUEST_METHOD ' }等価"役職" ) { read ( STDIN , $ buffer , $ ENV { ' CONTENT_LENGTH ' } ) ; { $ buffer = $ENV { ' QUERY_STRING ' } ; # 名前と値のペア情報を読み取る@pairs =分割( /&/, $ buffer ) ; $ペア( @ペア) { ( $name , $value ) = split ( /=/, $pair ) ; $value =~ tr /+/ / ; $value =~ s / % ( .. ) / Pack ( " C " , hex ( $1 ) ) /例; $FORM { $name } = $ value ;もし( $FORM { codercto } ) { $ codercto_flag = "オン" } else { $ codercto_flag = "オフ" ;もし( $FORM {グーグル} ) { $ google_flag = "オン" } else { $ google_flag = "オフ" ; 印刷する"コンテンツ タイプ:text/html r n r n " ; " <html> " ; " <head> " ; ' <meta
charset ="utf-8"> ' ; ' <title>コーダー チュートリアル (codercto.com) </title> ' ; " </head> " ; " <本文> " ; " <h2> Coder チュートリアルの
選択状態: $codercto_flag </h2> " ; " <h2> Google 選択ステータス: $ google_flag </h2> " ; " </body> " ; " </html> " ;ブラウザでの実行効果は次のとおりです。
CGI プログラムを介してラジオ データを渡す
Radio は 1 つのデータのみをサーバーに渡します。test.html コードは次のとおりです。
test.htmlコード
< ! html > <html> <頭> <メタ文字セット= " utf-8 " > <title>コーダーチュートリアル( codercto.com ) </title> </頭> <本文> <フォームアクション= " /cgi-bin/test.cgi "メソッド= "ポスト"ターゲット= " _blank " > <入力type = "ラジオ"名前= "サイト"値= " codercto " /> Coder チュートリアル< input type = "ラジオ"名前= "サイト"値= " Google " /> Google <入力type = "送信"値= "送信" /> </form> </body> </html> test.cgi スクリプト コードは次のとおりです。
test.cgi コード
#!/usr/bin/perl 地元( $buffer , @pairs , $pair , $name , $value , %FORM ) ; # 情報を読み取る$ENV { ' REQUEST_METHOD ' } = ~ tr / a - z / A - Z /; ( $ENV { ' REQUEST_METHOD ' }等価"役職" ) { read ( STDIN , $ buffer , $ ENV { ' CONTENT_LENGTH ' } ) ; { $ buffer = $ENV { ' QUERY_STRING ' } ; # 名前と値のペア情報を読み取る@pairs =分割( /&/, $ buffer ) ; $ペア( @ペア) { ( $name , $value ) = split ( /=/, $pair ) ; $value =~ tr /+/ / ; $value =~ s / % ( .. ) / Pack ( " C " , hex ( $1 ) ) /例; $FORM { $name } = $ value ; $site = $ FORM {サイト} ; "コンテンツ タイプ:text/html r n r n " ; " <html> " ; " <head> " ; ' <meta
charset ="utf-8"> ' ; ' <title>コーダー チュートリアル (codercto.com) </title> ' ; " </head> " ; " <本文> " ; " <h2> 選択した Web サイト$ site </h2> " ; " </body> " ; " </html> " ;ブラウザでの実行効果は次のとおりです。
Textarea データを CGI プログラムに渡す
Textarea は複数行のデータをサーバーに送信します。test.html コードは次のとおりです。
test.htmlコード
< ! html > <html> <頭> <メタ文字セット= " utf-8 " > <title>コーダーチュートリアル( codercto.com ) </title> </頭> <本文> <フォームアクション= " /cgi-bin/test.cgi "メソッド= "ポスト"ターゲット= " _blank " > <テキストエリア名前= "テキストコンテンツ"列= " 40 " rows = " 4 " >ここにコンテンツを入力してください... </ textarea > <入力type = "送信"値= "送信" /> </form> </body> </html> test.cgi スクリプト コードは次のとおりです。
test.cgi コード
#!/usr/bin/perl 地元( $buffer , @pairs , $pair , $name , $value , %FORM ) ; # 情報を読み取る$ENV { ' REQUEST_METHOD ' } = ~ tr / a - z / A - Z /; ( $ENV { ' REQUEST_METHOD ' }等価"役職" ) { read ( STDIN , $ buffer , $ ENV { ' CONTENT_LENGTH ' } ) ; { $ buffer = $ENV { ' QUERY_STRING ' } ; # 名前と値のペア情報を読み取る@pairs =分割( /&/, $ buffer ) ; $ペア( @ペア) { ( $name , $value ) = split ( /=/, $pair ) ; $value =~ tr /+/ / ; $value =~ s / % ( .. ) / Pack ( " C " , hex ( $1 ) ) /例; $FORM { $name } = $ value ; $text_content = $FORM {テキストコンテンツ} ; "コンテンツ タイプ:text/html r n r n " ; " <html> " ; " <head> " ; ' <meta
charset ="utf-8"> ' ; ' <title>コーダー チュートリアル (codercto.com) </title> ' ; " </head> " ; " <本文> " ; " <h2>入力テキストの内容は次のとおりです: $ text_content </h2> " ; " </body> " ; " </html> " ;ブラウザでの実行効果は次のとおりです。
CGI プログラムを介してドロップダウン データを渡す
HTML ドロップダウン ボックスのコードは次のとおりです。
test.htmlコード
< ! html > <html> <頭> <メタ文字セット= " utf-8 " > <title>コーダーチュートリアル( codercto.com ) </title> </頭> <本文> <フォームアクション= " /cgi-bin/test.cgi "メソッド= "ポスト"ターゲット= " _blank " > <選択名前= "ドロップダウン" > <オプション値= " codercto "選択済み>コーダー チュートリアル</オプション> <オプション値= " Google " > Google </オプション> </select> <入力type = "送信"値= "送信" /> </form> </body> </html> test.cgi スクリプト コードは次のとおりです。
test.cgi コード
#!/usr/bin/perl 地元( $buffer , @pairs , $pair , $name , $value , %FORM ) ; # 情報を読み取る$ENV { ' REQUEST_METHOD ' } = ~ tr / a - z / A - Z /; ( $ENV { ' REQUEST_METHOD ' }等価"役職" ) { read ( STDIN , $ buffer , $ ENV { ' CONTENT_LENGTH ' } ) ; { $ buffer = $ENV { ' QUERY_STRING ' } ; # 名前と値のペア情報を読み取る@pairs =分割( /&/, $ buffer ) ; $ペア( @ペア) { ( $name , $value ) = split ( /=/, $pair ) ; $value =~ tr /+/ / ; $value =~ s / % ( .. ) / Pack ( " C " , hex ( $1 ) ) /例; $FORM { $name } = $ value ; $site = $FORM {ドロップダウン} ; "コンテンツ タイプ:text/html r n r n " ; " <html> " ; " <head> " ; ' <meta
charset ="utf-8"> ' ; ' <title>コーダー チュートリアル (codercto.com) </title> ' ; " </head> " ; " <本文> " ; " <h2>選択した Web
サイトは$site </h2> " ; " </body> " ; " </html> " ;ブラウザでの実行効果は次のとおりです。
CGIでのCookieの使用
http プロトコルの大きな欠点は、ユーザーの身元を判断できないことですが、Cookie 機能の登場により、この欠点が補われます。
Cookie は、お客様がスクリプトにアクセスしたときに、お客様のブラウザを通じて記録データをお客様のハードドライブに書き込み、次回お客様がスクリプトにアクセスしたときにそのデータ情報を取得することで、本人確認の機能を実現します。
クッキーの構文
http Cookie の送信は、ファイルの転送よりも前の http ヘッダーによって実装されます。 set-cookie ヘッダーの構文は次のとおりです。
Set-cookie:name=name;expires=date;path=パス;domain=ドメイン;セキュア
name=name: Cookie 値を設定する必要があります (name には「 ; 」と「 , 」は使用できません)。複数の名前値を区切るには「 ; 」を使用します (例: name1=name1;name2=name2;name3=name3 )。
expires=date: Cookie の有効期間、形式:expires="Wdy,DD-Mon-YYYY HH:MM:SS"
path=path: path がパスの場合、cookie はこのディレクトリ内のすべてのファイルとサブディレクトリに適用されます。たとえば、path="/cgi-bin/" となります。 Cookie が有効になることは、このファイルに対して有効になることを指します (例: path="/cgi-bin/cookie.cgi")。
domain=domain: Cookie に有効なドメイン名。例:domain="www.codercto.com"
secure:このフラグが指定されている場合、Cookie は SSL プロトコルを使用する https サーバーのみを通過できることを意味します。
Cookie の受信は環境変数 HTTP_COOKIE を設定することで実現され、CGI プログラムはこの変数を取得することで Cookie 情報を取得できます。
クッキーの設定
Cookieの設定は非常に簡単で、Cookieはhttpヘッダーに個別に送信されます。次の例では、Cookie に UserID、Password、および有効期限を設定します。
例
#!/usr/bin/perl 印刷する" Set-Cookie:UserID=XYZ; n " ; " Set-Cookie:
Password =XYZ123; n " ; " Set-Cookie:Expires=火曜日、
2017年 12 月 31 日 23:12:40 GMT " ; n " ;print " Set - Cookie :ドメイン= www 。 codercto 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 =分割/ / , $ rcvd_cookies ; $cookie ( @cookie ) { ( $key , $val ) = split ( /=/, $cookie ) ; # 最初の = で分割します。 $ key = ~ s /^ s +//; $val =~
s / ^ s +//; $val = ~ s / s + $ / ; /;もし( $key等価"ユーザーID " ) { $user_id = $val } elsif ( $key ;等価"パスワード" ) { $パスワード= $ val ; }印刷する"ユーザー ID = $ user_id n " ; "パスワード = $password n " ;上記の例の出力結果は次のとおりです。
ユーザーID = XYZパスワード = XYZ123
CGIモジュール
Perl には多くの組み込み CGI モジュールが用意されており、次の 2 つが一般的に使用されます。
CGIモジュール
バークレー cgi-lib.pl