Ruby CGI プログラミング
Rubyは汎用言語であり、WEB開発に応用されるだけの言語ではありませんが、RubyはWEBアプリケーションやWEBツールの開発で最も一般的に使用されています。
Rubyを使用すると、独自のSMTPサーバー、FTPプログラム、またはRuby Webサーバーを作成できるだけでなく、Rubyを使用してCGIプログラミングも行えます。
次に、RubyのCGIプログラミングを少し時間をかけて学びましょう。
ウェブブラウジング
CGIがどのように機能するかをよりよく理解するために、Webページ上のリンクやURLをクリックしたときの流れを見てみましょう:
- 1. ブラウザを使用してURLにアクセスし、HTTP Webサーバーに接続します。
- 2. Webサーバーはリクエスト情報を受け取るとURLを解析し、アクセスされたファイルがサーバー上に存在するかどうかを探します。存在する場合はファイルの内容を返し、そうでなければエラー情報を返します。
- 3. ブラウザはサーバーから情報を受け取り、受け取ったファイルまたはエラー情報を表示します。
CGIプログラムは、Rubyスクリプト、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 ですが、Rubyでは .rb 拡張子も使用できます。
デフォルトでは、Linuxサーバーはcgi-binディレクトリを /var/www として設定しています。
CGIスクリプトを実行する別のディレクトリを指定したい場合は、httpd.conf 設定ファイルを次のように変更できます:
<Directory "/var/www/cgi-bin"> AllowOverride None Options +ExecCGI Order allow,deny Allow from all </Directory>
AddHandler に .rb 拡張子を追加すると、.rb で終わるRubyスクリプトファイルにアクセスできるようになります:
AddHandler cgi-script .cgi .pl .rb
CGIスクリプトの作成
最も基本的な Ruby CGI コードは次のとおりです:
#!/usr/bin/ruby puts "Content-type: text/html\n\n" puts "<html><body>This is a test</body></html>"
このコードを test.cgi ファイルに保存し、サーバーにアップロードして十分な権限を付与すれば、CGIスクリプトとして実行できます。
サイトのアドレスが http://www.example.com/ の場合、http://www.example.com/test.cgi でこのプログラムにアクセスでき、出力結果は「This is a test.」となります。
ブラウザがこのURLにアクセスすると、Webサーバーはサイトディレクトリ内で test.cgi ファイルを見つけ、Rubyパーサーを通じてスクリプトコードを解析し、HTMLドキュメントにアクセスします。
cgi.rb の使用
Ruby は CGI ライブラリを呼び出して、より複雑なCGIスクリプトを作成できます。
次のコードは CGI ライブラリを呼び出して、CGIスクリプトを作成します。
#!/usr/bin/ruby require 'cgi' cgi = CGI.new puts cgi.header puts "<html><body>This is a test</body></html>"
次のコードでは、CGIオブジェクトを作成し、ヘッダー情報を出力します。
フォーム処理
CGIライブラリを使用すると、フォーム送信(またはURL内のパラメータ)のデータを2つの方法で取得できます。例:URL: /cgi-bin/test.cgi?FirstName=Zara&LastName=Ali
CGI#[] を使用して、パラメータ FirstName と LastName を直接取得できます:
#!/usr/bin/ruby require 'cgi' cgi = CGI.new cgi['FirstName'] # => ["Zara"] cgi['LastName'] # => ["Ali"]
フォームデータを取得するもう1つの方法:
#!/usr/bin/ruby
require 'cgi'
cgi = CGI.new
h = cgi.params # => {"FirstName"=>["Zara"],"LastName"=>["Ali"]}
h['FirstName'] # => ["Zara"]
h['LastName'] # => ["Ali"]
次のコードは、すべてのキーと値を取得するために使用されます:
#!/usr/bin/ruby require 'cgi' cgi = CGI.new cgi.keys # => ["FirstName", "LastName"]
フォームに同じ名前のフィールドが複数含まれている場合、それらの同じフィールドの値は配列に保存されます。
次の例では、フォーム内の同じ名前の3つのフィールド「name」に、それぞれ "Zara"、"Huma"、"Nuha" という値を指定します:
#!/usr/bin/ruby
require 'cgi'
cgi = CGI.new
cgi['name'] # => "Zara"
cgi.params['name'] # => ["Zara", "Huma", "Nuha"]
cgi.keys # => ["name"]
cgi.params # => {"name"=>["Zara", "Huma", "Nuha"]}
注意:Ruby は GET メソッドと POST メソッドを自動的に判断するため、2つのメソッドを区別して扱う必要はありません。
以下は関連するHTMLコードです:
<html> <body> <form method="POST" action="http://www.example.com/test.cgi"> First Name :<input type="text" name="FirstName" value="" /> <br /> Last Name :<input type="text" name="LastName" value="" /> <input type="submit" value="Submit Data" /> </form> </body> </html>
Form フォームと HTML の作成
CGI には HTML を作成するための多数のメソッドが含まれており、各HTMLタグには対応するメソッドがあります。これらのメソッドを使用する前に、CGI.new を使用して CGI オブジェクトを作成する必要があります。
タグのネストをより簡単にするために、これらのメソッドはコンテンツをコードブロックとして扱い、コードブロックは文字列を返してタグのコンテンツとします。次のようになります:
#!/usr/bin/ruby
require "cgi"
cgi = CGI.new("html4")
cgi.out{
cgi.html{
cgi.head{ "\n"+cgi.title{"This Is a Test"} } +
cgi.body{ "\n"+
cgi.form{"\n"+
cgi.hr +
cgi.h1 { "A Form: " } + "\n"+
cgi.textarea("get_text") +"\n"+
cgi.br +
cgi.submit
}
}
}
}
文字列のエスケープ
URL内のパラメータやHTMLフォームデータを処理する際には、指定された特殊文字をエスケープする必要があります。例:引用符(")、バックスラッシュ(\)。
Ruby の CGI オブジェクトは、これらの特殊文字のエスケープを処理するための CGI.escape および CGI.unescape メソッドを提供します:
#!/usr/bin/ruby require 'cgi' puts CGI.escape(Zara Ali/A Sweet & Sour Girl")
上記のコードの実行結果は次のとおりです:
#!/usr/bin/ruby require 'cgi' puts CGI.escape(Zara Ali/A Sweet & Sour Girl")
別の例:
#!/usr/bin/ruby
require 'cgi'
puts CGI.escapeHTML('<h1>Zara Ali/A Sweet & Sour Girl</h1>')
上記のコードの実行結果は次のとおりです:
<h1>Zara Ali/A Sweet & Sour Girl</h1>'
CGI クラスのよく使われるメソッド
以下は、Ruby の CGI クラスの関連メソッドの一覧です:
- Ruby CGI- 標準CGIライブラリ関連メソッド
Cookie とセッション
- Ruby CGI Cookies- CGI Cookie の処理方法。
- Ruby CGI Sessions- CGI セッションの処理方法。