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アーキテクチャ図

cgiarch


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>')

上記のコードの実行結果は次のとおりです:

&lt;h1&gt;Zara Ali/A Sweet & Sour Girl&lt;/h1&gt;'

CGI クラスのよく使われるメソッド

以下は、Ruby の CGI クラスの関連メソッドの一覧です:

  • Ruby CGI- 標準CGIライブラリ関連メソッド

Cookie とセッション

その他の拡張