今野 滋
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['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月