English Korean Chinese

RubyでCGI・入門編

今野 滋

環境変数ENV

CGIプログラムの置かれた環境を調べたり、CGIプログラムに送られてきた情報を受け取る受け皿が、ハッシュENVです。大文字で記述された定数のハッシュですが、環境が変わると値が変わるという意味で「変数」です。ここでは、ENVの内容を見てみましょう。

まず、hello.cgi の中身を下記に書き換えて、FTP転送してください。

#!/usr/local/bin/ruby
print "Content-type: text/plain;charset=Shift_JIS\n\n"
printf "%20s  %s\n","key","ENV['key']"
printf "%20s  %s\n","--------------------","--------------------"
for key,value in ENV do
  printf "%20s  %s\n", key, value
end

# ¥n はダブルクオート"で挟まれた内部でのみ有効で、改行を意味します。
# printf は書式付き出力。書式については、sprintf を参照のこと。
# for key,value in ENV do … end は、ハッシュENVのキーと値を繰り返しkey,valueに移し取り、… を実行ます。
 よくわからない場合は下記をRDEで試してください。

h = Hash.new; h['apple'] = "リンゴ"; h['banana'] = "バナナ"
h.each do |key,val| print key, "=>", val, "\n" end

注意:このプログラムは、練習が終わったら削除するか、又は他の内容に書き換えてください。放置すると、悪意を持った人にサーバーの情報を教える事になってしまいます。

このプログラムをTerminalから実行してみます

cd www/test
./hello.cgi

このプログラムを、ブラウザで出力させてみます。(自分のホームページのアドレスに続けて、test/hello.cgi)

Terminalでの実行結果と、ブラウザでの実行結果を見比べてみてください。だいぶ違うと思います。これが環境の違いです。

ENVの例:ブラウザでの表示

環境変数
環境変数内容
ENV['SCRIPT_URI']CGIプログラム自身が置かれている場所/ファイル名。携帯端末に対するLocation適用に便利。
ENV['SCRIPT_URL']上記の相対パス。携帯端末に対するLocation適用には使えない。
ENV['SCRIPT_FILENAME']上記のサーバー内部での値。
ENV['HTTP_USER_AGENT']閲覧者のブラウザの名前。携帯電話の機種を自動判別するときなどに便利。
ENV['REMOTE_HOST']閲覧者が受信に使っているサーバー名。ガキのイタズラを牽制するのに役立つ。
ENV['REMOTE_ADDR']上記をIPアドレス(数字の組)で表したもの。

testpage.html を再び編集します。画像の代わりに、hello.cgi へのリンクを入れます。

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang="ja">
<head>
  <meta content="text/html; charset=Shift_JIS" http-equiv="content-type">
  <title>testpage</title>
</head>
<body>
<h1>テストページ</h1>
<p>世界のみなさん、こんにちは。</p>
<p><a href="./hello.cgi?HogeHoge">テスト用CGIへのリンク</a></p>
</body></html>

これをFTP転送して、ブラウザで表示させ、リンクをクリックすると、環境変数が増えています。

環境変数内容
ENV['HTTP_REFERER']クリックされたファイルの場所。「戻る」やリンク元の記録に便利。
ENV['QUERY_STRING']アドレスの後ろに付けた?以降の文字列。外部からの入力に便利。

使用上の注意:環境変数 ENV は「定数」扱いなので書き換えることはできません。 ↓例:文字列の中のaをbに置き換える

これはエラーになります。

str = ENV['SCRIPT_URI']
str.gsub!(/a/,"b")

これはエラーになりません。

str = ENV['SCRIPT_URI']
str = str.gsub(/a/,"b")

更新日:2005年01月

© 2004-2005 S.Konno, all rights reserved. [ 質問 ] [ TOP ] [ J2J ] [ 目次 ] [<<戻る ] [ 次へ>>]