HTML と CGI の仕組み
1.HTML の構造
HTML は、Hyper Text Markup Language の略です。...と、HTMLそのものの説明が知りたければ書籍を参考にしてください。簡単に言うとWeb Browser で表示可能な RichText です。UNIX ユーザーからみると Web Browser で表示するための TeX や troff のようなものです。
構造はいたって簡単で、1ページあたり以下のようなフォーマットで構成されています。
<!-- コメント --> <HTML> <HEAD> <TITLE>CGI Sample</TITLE> </HEAD> <BODY BGCOLOR=#FFFFFF TEXT=#000000> ... </BODY> <HTML> <!-- コメント -->
<HTML> </HTML> | これがHTML の始まりと終わりを表します。 |
<HEAD> </HEAD> | これがヘッダーと呼ばれる部分。実際に表示されないが、Web Browser には解釈される部分です。JavaScript の定義やタイトル、METAタグと呼ばれる特殊なタグを記述する領域です。 |
<TITLE> </TITLE> | Web Browser のタイトルに表示されるテキストを記述できます。 |
<BODY> </BODY> | このタグで囲まれる部分が実際に Web Browser に表示されます。 |
上記にあるように、HTML で使用する<>で囲まれた命令のようなものをタグと呼びます。このタグには、テキストを扱うもの、イメージを扱うもの、レイアウトに関するものなど数多く用意されています。タグは、大文字・小文字を区別しません。見やすくするために大文字を利用する人が多い。個々のタグについては、HTML の書籍等を参考にしてください。
タグは、<BR>、<HR>のようにそれ単体で扱えるものや、 <TABLE> </TABLE> のように <tag> で始まり </tag> で終わらなければならないもの、<P>のようにどちらでも扱えるものがあります。 また、タグには、細かい設定(色やサイズなど)を行えるように多くのパラメーターをもつものもあります。
2. HTML を使用する上での注意
HTMLでは、改行とスペース、タブの扱いが通常のテキストとは異なります。改行、タブは、HTMLの表記では無視されます。スペースについては、一つ目は解釈されますが、それ以降はいくつあっても無視されます。従って、スペースを用いてレイアウトを調整しようとしても思ったように調整は出来ません。そこで、レイアウトする場合には極力テーブルタグ<TABLE>やインデントタグ<DD>,<DIV>を用いることを勧めます。
特殊記号についても表記が異なります。HTMLのタグと勘違いしやすい <, > といった記号や &, " などは一文字で表しません。
記述方法 |
表示 |
< |
< |
> |
> |
" |
" |
& |
& |
改行については、<BR>または<P>を用います。<BR>の扱いが通常の改行と同じ扱いになります。ただし、Browserによっては <BR> を複数連続で記述しても一つとしてみなしてしまうものもあります。<P>は、文章の節ごとを区切るのに使用されますが、現在では <DIV>を用いることが一般的になっています。
HTML でページを作成する場合、.html や .htm 、.shtml(これは特別)
といった拡張子が標準で使用されます。また、Web Browser で URL を http://www.example.com/sample/
のように指定したときに参照されるファイルは実際には http://www.example.com/sample/index.html
となります。これは、Web サーバー側でデフォルトとして参照されるファイルが index.html になっているからです(Web
サーバーの設定で変更可能)。
漢字コードの取り扱いにも注意が必要です。ブラウザーに正しく漢字コードを認識させるために、HTMLを記述する際に<META>タグを使用して HTMLを記述する際にどの漢字コードを使用しているか指定する必要があります。記述は<HEAD>タグ内に以下のようにします。
<META HTTP-EQuiv="Content-Type" Content="text/html;
charset=Shift_JIS">
この <META>タグの charaset の部分に使用している漢字コードを指定します。
charset |
漢字コード |
ISO-2022-JP |
JIS コード |
Shift_JIS |
Shift JIS コード |
EUC-JP |
EUC コード |
3.CGI の構造
CGIとは、Common Gateway Interface の略です。HTTPサーバーが、 Web Browserから受け取ったデータを解析したり結果を返したりするために CGIが使用されます。 CGIのプログラミングは、標準入力から受け取ったデータを「解析」「分析」「無視」などなど思いのままの操作を行い、その結果をMIMEの HTMLフォーマット(Content-type: text/html)で標準出力に出力ようなプログラムを作成すれば実現できます。
実際の動きをステップごとに説明します。
Web Browserに、ユーザーから受け取りたい情報をテキストエリアやボタンで表示。この際、HTML の <FORM> タグを使用してテキスト入力エリアやボタン、メニューといった部品を配置します。
ユーザーは、Web Browser 上に表示されたテキストエリアやボタンによって情報を入力します。
ユーザーからの情報は、 <FORM>タグで指定した CGI に、 Web サーバーによって渡されます(このとき、Web サーバーは標準出力にデータを出力)。
Web サーバーからのユーザー情報を CGI が解析しその結果を Web サーバーに返します(このとき、Web サーバーは標準入力から MIME形式で結果を受けとります)。
Web Browser は Web サーバーからのデータを表示します。
4.CGIを作る上での注意
CGI を作る場合、開発言語は特に限定されません。標準入力からデーターを受け取って、標準出力に HTML データを出力できる仕組みが作れるものなら何でも構いません。Shellスクリプト、Perlスクリプト、C 言語で作られた実行可能プログラム などなどあらゆる物が利用できます。
実は、広く一般的な方法は標準入出力を使うのですが、QUERY_STRING という変数にデータを格納し、CGI がその変数を参照することでデータを受け取ることが出来る仕組みもあります。この違いは、HTML で書かれた <FORM> の METHOD パラメータによって判断されます。
METHODの値が GET の場合、QUERY_STRING という Web サーバーが持つ環境変数にデータがセットされます。
METHODの値が POST の場合、標準入出力を使用してデータがやり取りされます。このとき、CONTENT_LENGTH という Web サーバーが持つ環境変数にデータのサイズがセットされます。
<FORM> によって得られたユーザー情報は、ある条件に基づいた形式で構成されています。それは、<FORM> の部品であるテクストエリアやボタン、メニュー、入力フィールドにつけられた名前とそれに与えられたユーザーからの値というグループデータで構成されます。さらに、部品がたくさんあってもすべてまとまったグループデータ(<FORM> </FORM> で囲まれた部分に指定された部品はすべて同じグループデータ)として構成されます。
部品名=値&部品名=値&部品名=値&部品名=値&部品名=値
<FORM> によって渡された「部品名=値」を& で区切った文字列を QUERY STRING と呼びます。
部品名は、<FORM> </FORM> で囲まれた中にあるテキストエリアやボタン、入力フィールドといった部品につけられた名前を意味します。たとえば、名前を入力してもらうために入力フィールドタグである <INPUT> を使用した場合、<INPUT TYPE="text" NAME="UserName"> のように記述します。このとき、 NAME パラメータに記述された UserName が部品名となります。
値は、
Web Browser に表示された入力フィールドにユーザーが入力した文字になります。ボタンやチェックボックスの場合、VALUE パラメータで指定された値になります。
さらに、値の形式は encode された状態で CGI に渡されます。これは、URL で扱えない文字を Web Browser が扱えないからです。(URL
の一部と誤認してしまう恐れもあるため) そのため、CGI でデータをはじめに受け取った場合、 データの値部分を decode する作業が必要になります。
encode のフォーマット
特殊記号を除く ASCII 文字([A-Z][a-z])はそのまま。
スペースは、+ 記号に変換される。
それ以外は、% を付けた 16進数に変換される。
5.実際の画面と HTML および CGI
それでは、実際の例を元に表示画面を使って説明します。
まず、以下のような HTML の場合:
<HTML>
<HEAD>
<META HTTP-EQuiv="Content-Type" Content="text/html; charset=Shift_JIS">
<TITLE>CGI Sample</TITLE>
</HEAD>
<BODY BGCOLOR=#FFFFFF TEXT=#000000>
<CENTER> <FONT SIZE=+2> <I><B><FONT COLOR=#007744>CGI Sample</FONT></b></I></FONT> <BR> <BR> <TABLE WIDTH=80%%> <TR> <TD COLSPAN=2> <FORM METHOD="post" ACTION="/cgi-bin/sample.cgi"> <p><FONT COLOR=#0000BB>名前:</FONT> <INPUT TYPE="text" NAME="UserName"> <BR> </p> <p> <font color="#0000BB">性別</font>: <input type="checkbox" name="Gender" value="male"> 男 <input type="checkbox" name="Gender" value="female"> 女</p> <p><FONT COLOR=#0000BB>説明:</FONT><BR> <TEXTAREA NAME="Contents" ROWS=10 COLS=50></TEXTAREA> <BR> </p> <CENTER> <INPUT TYPE="submit" VALUE="登録"> <INPUT TYPE="reset" VALUE="クリア"> </CENTER> </FORM> </TD> </TR> </TABLE> </CENTER> <P> <CENTER> </CENTER> </BODY> </HTML>
実際の Web Bowserの表示では次のようになります。
HTML の <FORM>タグの中で、ACTION パラメータによって指定されている CGI (sample.cgi) によってユーザーが入力した情報を解析します。
CGI である sample.cgi を Perl で書いた場合の例:
#!/usr/bin/perl # HTML HEADER print "Content-type: text/html\n\n"; print "<HTML>\n"; print "<HEAD>\n"; print "<META HTTP-EQuiv=\"Content-Type\" Content=\"text/html; charset=Shift_JIS\">"; print "<TITLE>CGI Sample (Answer)</TITLE>\n"; print "</HEAD>\n"; print "\n"; print "<BODY BGCOLOR=#FFFFFF TEXT=#000000>\n"; print "\n"; print "<CENTER>\n"; print "<FONT SIZE=+2>\n"; print "<I><B><FONT COLOR=#007744>CGI Sample (Answer)</FONT></I></B>\n"; print "</FONT><BR>\n"; print "<BR>\n"; read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'}); @pairs=split(/&/,$buffer); foreach $pair(@pairs) { ($name,$value)=split(/=/,$pair); $value=~tr/+/ /; $value=~s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg; printf ("NAME: %s, VALUE: %s<BR>\n", $name, $value); } print "\n"; print "</BODY>\n"; print "</HTML>\n";
この CGI では、データを解析し、その結果を Web Browser が表示できる形で Web サーバーに返します。MIME 形式にしなくてはならないので最初の行でその旨を指定しています。データを解析している部分では、データの部品名と値を分割し、値部分は decode 処理を行っています。
この結果は、Web Browserには次のように表示されます。
6.Web サーバー:Apahce のインストール方法と設定
6.1 ソースコードの入手方法
apache のソースコード一式があればそれだけで Web サーバーは構築できます。 apache の最新のソースコードを http://www.apache.org/ またはそのミラーサイトなどから取り寄せておきます。
apache のソースコードを取り寄せることができたら、 それを適当なディレクトリで展開しておきます。
$ gzip -dc apache_1.3.6.tar.gz | tar xvf -
このようにすると apache_1.3.6
というディレクトリが作られて、 その配下に apache のソースコードが展開されるます。
6.2 コンパイル前のコンフィグレーション
apache をコンパイルするためのコンフィグレーションは、どういったモジュールを組み込むかを選択するだけです。 ただしデフォルトで、通常利用に必要と思われるモジュールは組み込まれるように設定されているため、モジュールを減らしてサーバーを軽くしたいなどの変更がなければこの節は読む必要はありません。 組み込むモジュールの選択は、 apache_1.3.6/src
の下に Configuration
というファイルを作成することで行います。 テンプレートとなる Configuration.tmpl
を元に適宜修正を加え簡単に作成することができます。
モジュールの選択は、「Module configuration
」とある部分の以降で行います。必要なモジュールについては
「Module モジュール名 オブジェクト名
」という記述を残し、 不要なモジュールについては記述を削除するか
「#
」でコメントアウトします。 各モジュールの機能については apache のソースコードに 同梱されている apache_1.3.6/htdocs/manual/mod
以下のドキュメントを参照してください。
6.2.1 ログに関するモジュール
config_log_module |
アクセスログを記録するためのモジュール。 特に指定がなければ一般的な common log format でログを記録します。また、ログ情報を指定したコマンドに渡すように設定することもできます。 |
agent_log_module |
アクセスしてきたブラウザの種類を記録するためのモジュール。 |
referer_log_module |
アクセスしてきたブラウザが「どの URLからたどってきたのか」という情報を記録するためのモジュール。 |
6.2.2 サーバのステータスに関するモジュール
status_module |
サーバの活動状況をハイパーテキスト またはプレーンテキストで取得できるようにするためのモジュール。 活動中のサーバ数やトータルアクセス数など多くの情報を取得することができるようになります。 |
info_module |
サーバの設定内容をハイパーテキストで取得できるようにするためのモジュール。 指定された場所へブラウザでアクセスすることにより詳細な設定内容を閲覧することができます。 |
6.2.3 CGI/SSI に関するモジュール
includes_module |
SSI(Server Side Include)機能を実現するためのモジュール。 SSI とは、特定の書式にしたがったハイパーテキストファイルをサーバ側で処理することによって動的に変化させるための仕組みで、そのファイル自身の最終更新日時やサイズ、 アクセスがあった時点での時刻を表示させたり、任意のコマンドの実行結果を組み入れたりすることに使用できます。 |
cgi_module |
CGIプログラムを実行させるためのモジュール。 CGI ハンドラが設定されているファイルなどは、このモジュールによって CGIプログラムとして実行されます。 |
env_module |
CGI プログラムや SSI プログラムに指定した環境変数を継承したり、 CGI/SSI プログラムを起動する際に 特定の環境変数を設定するためのモジュール。 |
imap_module |
イメージマップを処理するためのモジュール。 |
6.2.4 URL とファイルのマッピングに関するモジュール
dir_module |
ディレクトリに対するアクセスがあった場合に、 そのディレクトリ内の特定のファイルの内容を返したり、ファイルがなければディレクトリ内のファイル一覧を生成して返したりするモジュール。 |
userdir_module |
~foo という形でのアクセスに対応するモジュール(foo はアカウント名)。 例えば ~foo/bar という URL への要求がきた場合、 ~foo/public_html/bar や、/home/foo/bar を元に情報を送り返すなどといった設定が可能です。 URL を記述する際に 「 ~ (チルダ)」は、 正確には「%7E 」と表現しなくてはならないことになっています。 |
alias_module |
エイリアスやリダイレクトを実現させるためのモジュール。 URL で指定されたあるパスが、ホストのディスク中のどのディレクトリに対応するかを設定したり(通常はドキュメントルートと呼ばれるディレクトリからの相対パスとして処理されます)、 特定のパス以下への要求を、別のサーバへリダイレクト(転送)させたりすることができます。 |
action_module |
指定されたファイルタイプを要求されたり指定された方法でリクエストが発行された場合に、任意の CGI プログラムを実行させるためのモジュール。 どのような URL へのリクエストであったかという情報は、環境変数として CGI プログラムに渡されます。 |
rewrite_module |
要求された URL について正規表現を利用して書き換えを行うモジュール。 |
6.2.5 ブラウザに返送する情報に関するモジュール
6.2.6 アクセス制御に関するモジュール
access_module |
ホスト名や IP アドレスによってアクセス制限をするためのモジュール。 IP アドレスでの制限では最初の 1〜3 バイトだけを指定することができますが、任意のマスクを指定することはできません。 |
auth_module |
ユーザ名とパスワードによるアクセス制御をするためのモジュール。 |
db_auth_module |
auth_module のユーザ名とパスワードの組合わせは単なるテキストファイルに記述されるが、このモジュールによってバークレイ
db 形式で管理されるようになります。 |
dbm_auth_module |
auth_module のユーザ名とパスワードの組合わせは単なるテキストファイルに記述されるが、このモジュールによって dbm形式で管理されるようになります。 |
msql_auth_module |
auth_module のユーザ名とパスワードの組合わせは単なるテキストファイルに記述されるが、このモジュールによって mSQL形式で管理されるようになります。 |
digest_module |
MD5 を利用したチャレンジ-レスポンス型の認証(RFC2069)を行うためのモジュール。 auth_module 、 db_auth_module 、 dbm_auth_module と digest_module の関係はちょうど PPP
の PAP と CHAP に似ています。 digest_module を利用した認証の方がより secure
なのですが、 対応しているブラウザがまだまだ少ないという問題があります。 |
anon_auth_module |
auth_module などではユーザ名とパスワードを使用したアクセス制御を行うが、このモジュールでは anonymous
ftp スタイルでのアクセスを行わせることが可能となります。 パスワード代わりのメールアドレスの正当性については簡単なチェックを行うこともでき、ログに残すことも可能です。 |
6.2.7 proxy に関するモジュール
proxy_module |
キャッシュ機能付き proxy をさせるためのモジュール。 |
6.2.8 ヘッダに関するモジュール
asis_module |
リクエストに応えてファイルの内容を転送する際に、ほとんど何も手を加えないというファイルタイプを作るモジュール。 このタイプのファイルについては HTTP レベルのステータスやヘッダですらサーバによって生成されることがなくなります。 特殊なヘッダを持たせたい場合などには有効。 |
cern_meta_module |
CERN 版 HTTP サーバで採用されていた、meta ファイルによる HTTP レベルのヘッダ調整をサポートするモジュール。 |
expires_module |
ファイルタイプに合わせて各情報の有効期間を設定するモジュール。 |
headers_module |
任意のヘッダ情報を付加したり除去したりするためのモジュール。 |
usertrack_module |
クッキーのやり取りをサポートするモジュール。 |
example_module |
API を示すためのサンプルモジュール。 組み込んではいけません。 |
6.3 コンパイルおよびインストール
モジュールの選択が完了したら選択内容(およびその他の設定内容)を 反映させるため configure という shell スクリプトを実行します。 これを忘れるとせっかく設定した Configuration ファイルの内容が有効にならないので注意してください。 実行する configure は、apache_1.3.6/src/Configure
ではなく apache_1.3.6/configure
です。
$ ./configure Configuring for Apache, Version 1.3.6 + Warning: Configuring Apache with default settings. + This is probably not what you really want. + Please read the README.configure and INSTALL files + first or at least run './configure --help' for + a compact summary of available options. .... Creating Makefile in src/modules/standardこの設定では、それそれのモジュールや設定ファイルのテンプレート、httpd サーバーをインストールする場所が /usr/local/apache(デフォルト) になります。もし、インストールする場所を変更したいなら
configure
という shell スクリプトを実行する際に --prefix=/install/path
コマンドラインオプションによって好みの場所を指定してください。あとは
makeコマンドを実行するだけです。
$ make $ make install
コンパイルが問題なく終了したら、必要なモジュールをインストールします。
6.4 apache(httpd) の動作時の設定ファイル
apache が起動時に参照する、設定ファイルの記述について説明します。 apache が起動時に参照する設定ファイルは httpd.conf、srm.conf、
access.conf の 3 つのファイルです(新しいバージョンでは httpd.conf
で全ての設定を行えます)。 各ファイルのためにテンプレートとして /usr/local/apache/conf
(デフォルト)の下に
httpd.conf-dist、srm.conf-dist、access.conf-dist が提供されているで、それらをベースにして変更を加えていきます。
6.4.1 httpd.conf
このファイルには apache サーバの基本的な動作条件を記述します。 例えば、サーバを起動するポート番号やサーバのタイプ、またサーバ実行時のユーザ/グループ権限やサーバが動作する際の基本ディレクトリやログファイル名などといった項目があります。書式は、ほとんど「項目名 設定値
」という形で設定していきます。 この書式は他の
ServerType |
apache の起動タイプを設定します。 設定できるのは standalone か inetd で、 前者はデーモンプロセスとして起動され、 後者は inetd から起動されることを前提とします。 standalone の場合は OSの起動時に apache も起動されるような設定を、 また inetd の場合には /etc/inetd.conf
に apache を起動するような設定をしておかなくてはなりません。一般にはデーモンプロセスとして動作させるための standalone を選択するとよいでしょう。 |
Port |
apache を起動するポート番号を設定します。 デフォルトで 80 ですが、 80 を含めて 1024 以下のポート番号でサーバを起動するためには、立ち上げ時に
root 権限が必要となります。 その場合、 apache は root 権限で動作することになるので、 User および Group で適切な権限を与えておくことを忘れてはなりません。 |
User |
apache が動作する際のユーザ権限を設定します。 設定方法はユーザ名で設定するかユーザ ID で設定するかのどちらかで、 ユーザ ID で設定する場合には「#」を伴って「#100」などと記述します。 なお、この項目を作用させるためには root 権限で apache サーバを起動していなければなりません。 |
Group |
apache サーバが動作する際のグループ権限を設定します。 設定方法は User と同じです。 |
ServerAdmin |
エラーメッセージなどに記載するためのサーバ管理者の メールアドレスを設定します。 |
ServerRoot |
apache サーバが動作する際に基本とするディレクトリを設定します。 httpd.conf 以外の設定ファイルや各種ログファイルは、 基本的にここで設定したディレクトリから 相対的に参照されます。 |
HostnameLookups |
on の場合、アクセスしてきたクライアント(ブラウザを利用しているPC)のアドレスを IP アドレスではなく DNSで引き直しホスト名を解決する。 |
ErrorLog |
サーバ動作中に発生したエラーのログを記録するファイルを設定します。 |
TransferLog |
アクセスログを記録するファイルを設定します。 |
RefererLog |
どの Web ページからどのページへ到達したのかという記録を残すファイル名を設定します。 referer_log_module を組み込んでいない場合には無効です。 |
AgentLog |
アクセスしてきたブラウザの種類を記録するファイルを設定します。 agent_log_module を組み込んでいない場合には無効です。 |
PidFile |
メインの apache のプロセス ID を格納するファイルを設定します。 このファイルに記述されているプロセス ID は apache の終了や 初期化の際に利用します。 |
KeepAlive |
keep-alive を利用するかどうかを設定します。 |
MaxSpareServers |
リクエスト待ち状態のサーバプロセスが、最大いくつまで存在してもよいかを設定します。 メインの apache はリクエスト待ち状態のサーバプロセスが ここで設定した数よりも多くなると、余ったサーバを適宜終了させます。アプリケーションサーバーなどを構築して運用する場合、システムの CPU やメモリを増設しても、この値を適切な値に設定しないとパフォーマンス強化の効果が得られないので注意してください。 |
MinSpareServers |
リクエスト待ち状態のサーバプロセスが、最小いくつ存在しなくてはならないかを設定します。 メインの apache はリクエスト待ち状態のサーバプロセスが、ここで設定した数よりも少なくなると適宜必要な数だけ分身のサーバを生成します。 |
MaxClients |
サーバーが、同時にアクセスを受け付けられるクライアント数の最大値を設定します。 |
StartServers |
apache の起動時にいくつの分身サーバを作成するかを設定します。 |
6.4.2 srm.conf(現在のバージョンでは httpd.conf で全ての設定を行えます)
このファイルでは、ハイパーテキストファイルを置く場所や各種ハンドラの割り付け設定など、リクエストに対してどのように振る舞うかを設定します。 最低限、設定しておくべき項目とその意味について説明します。
DocumentRoot |
ハイパーテキストファイルの置き場所となるディレクトリを設定します。 例えばホスト名 www.foo.com のホストで DocumentRoot
/usr/local/apache/htdocs と設定していた場合、 http://www.foo.com/bar.html で参照される情報の実体は /usr/local/apache/htdocs/bar.html となります。 指定するディレクトリ名の末尾に「/」を付けてはいけません。 |
UserDir |
「~who」に対する要求がきた場合に どこに置いてあるファイルを対応させるかを設定します。 デフォルト設定は UserDir
public_html で、URLに http://www.foo.com/~who/bar.html という記述がある場合、ユーザ whoのホームディレクトリの下にある public_html/bar.html (~who/public_html/bar.html) が対応します。 また UserDir /home/usr/www という設定をしていれば /home/usr/www/who/bar.html が、 UserDir /home/*/www なら /home/who/www/bar.html がそれぞれ対応するようになります。 UserDir にはローカルファイルシステムのパス名だけではなく、 他のサーバへの URL(の一部)を指定することも可能で、例えば UserDir http://www.baz.com/*/usr などと記述すれば http://www.baz.com/who/usr/bar.html へ転送されるようになります。 |
DirectoryIndex |
ディレクトリに対する(末尾が「/」で終わる URL への)アクセスがあった場合に、 実際のディレクトリの中身の一覧の代わりに 転送するファイルのファイル名を設定します。
デフォルトでは index.html で、 複数のファイルを列挙することもできます。 |
FancyIndexing |
アイコンを使ったディレクトリの一覧にするかどうかを設定します。 |
HeaderName ReadmeName |
ディレクトリ一覧を作る際に、ここで設定したファイル名のファイルがあれば、 一覧の末尾/冒頭にその内容を添付します。 |
IndexIgnore |
ディレクトリ一覧に載せないファイル名を設定します。 ファイル名は複数列挙することができ、ワイルドカードを使用することもできます。 |
AccessFileName |
各ディレクトリに対するアクセス制御情報を記述するファイルを設定します(通常は .htaccess )。後で説明する access.conf は、そのサーバがやり取りできる情報全体に対する制御情報を記述するためのものですが、
ここで設定したファイルの内容は、そのファイルがあるディレクトリの下にのみ影響が及ぶものです。 |
AddHandler |
指定した拡張子を持つファイルに対して任意のハンドラを割り当てます。 例えば AddHandler server-parsed
.shtml と設定した場合、拡張子 shtml を持つファイルについては SSI ハンドラが割り付けられ、結果としてそのファイルには
SSI の効果が適用されるようになります。 |
Alias |
指定された URL のパス(サーバ名の後ろに続く部分)を、特定のディレクトリに対応づけます。 DocumentRoot で設定したディレクトリの下にないディレクトリをそのサーバで扱えるようにしたい場合に設定します。 |
ScriptAlias |
Alias とほぼ同様の働きをしますが、 ScriptAlias で指定したディレクトリの中身については、すべて
CGI プログラムであると解釈される(CGI ハンドラが割り付けられる)という点で異なります。 |
AddType |
指定した拡張子を持つファイルに対して、任意のファイルタイプを割り当てます。 例えば AddType text/plain .pl のような設定をすると、 拡張子 pl を持つファイルには text/plain というタイプが割り当てられ、ブラウザでは単なるテキストとして扱われることになります。 |
6.4.3 access.conf(現在のバージョンでは httpd.conf で全ての設定を行えます)
このファイル
では、ディレクトリなどに対するアクセス制御情報を設定します。 さらに、ディレクトリに特殊な意味をもたせることもできます。 srm.confの中の AccessFileName
で設定した名前のファイルは、access.confのサブセットにあたり、そのファイル自身が存在するディレクトリの下だけに影響力を持ちます。 access.conf(および AccessFileName
で設定したファイル名のファイル)での主な設定項目について以下に記述します。
<Directory> |
アクセス制御情報のターゲットとなるディレクトリ(その配下も含む)と記述内容を <Directory>〜</Directory> によって設定します。 具体的には <Directory /usr/local/apache/htdocs> といった記述からはじまり、/usr/local/apache/htdocs 以下に対するアクセス制御情報を記述します。 そして最後に </Directory> で締め括ります。
ディレクトリの指定には、フルパスでの指定する意外に <Directory /usr/local/apache/htdocs/*> のようなワイルドカードによる指定や 正規表現による指定が可能です。 |
allow /deny |
指定したディレクトリへのアクセス可能/不可能なホストをホスト名や IP アドレスで列挙します。 |
order |
上記の allow および deny に記述したリストのどちらを優先して評価するかを指定します(allow,deny または deny,allow )。 また、allow のリストに含まれかつ deny のリストに含まれないホストだけにアクセスを許可するような設定(mutual-failure )も可能です。 |
Options |
指定したディレクトリの下のファイルに与える属性を列挙します。 設定できる属性は以下の通りです。
#exec や #include での
プログラムの起動は禁止します。
DirectoryIndex で指定したファイルが なければディレクトリの内容一覧を生成することを許可します。
|
AllowOverride |
AccessFileName で指定したファイルの内容によって、 access.conf で行っている設定を上書きできる属性を指定します。セキュリティの観点などから一切上書きを許可しない場合には None を設定します。 |
SetHandler |
指定されたディレクトリに存在するファイルに、任意のハンドラを割り付けます。 |
Options
の中の ExecCGI
や Includes
などを適切に設定していない場合、 いくら CGI ハンドラを割り当てていても CGI スクリプトとして扱いません。 また、以下のような設定がある場合には /usr/local/apache/htdocs
の下の任意の .htaccess
に Options ExecCGI
といった 記述を加えても有効になりません。
<Directory /usr/local/apache/htdocs> AllowOverride None </Directory>
6.4.4 バーチャルホストの設定
バーチャルホストというのは、DNS の別名機能などを使って 1 つのホストに複数の名前を割り付け各名前ごとに見掛け上別の Web サーバであるかのごとく振る舞わせることを言います。
こうした振る舞いを apache で有効にする場合、 httpd.conf
に <VirtualHost>〜</VirtualHost>
といった記述をしなくてはなりません。
<VirtualHost other.example.com> ServerAdmin webmaster@other.example.com DocumentRoot /usr/local/apache/vhost/other.example.com ServerName other.example.com ErrorLog logs/other.example.com-error_log TransferLog logs/other.example.com-access_log </VirtualHost>
この例では other.example.com
というバーチャルなWeb サーバを設定したこととなり、ハイパーテキストを置くためのトップディレクトリからログファイルまでまったく別に設定することができます。
もちろん、ネームサーバーに DNS の登録をするなどして other.example.com
という名前でそのホスト自身を参照できるようにしておかなくてはならなりません。
6.5 起動および終了方法
6.5.1 apache の起動方法
apache の起動は非常に簡単です。
# /usr/local/apache/bin/apachectl start
configure
という shell スクリプトを実行時に --prefix=/install/path
コマンドラインオプションを指定した場合、apachectl
コマンドの場所は異なります。
なお、ホストの起動とともに apache を起動させるためには、 上のコマンドを /etc/init.d(/etc/rc.local)
などにコピーしてく必要があります。
6.5.2 apache の終了方法
apache を終了させるには、 起動時と同じ apachectl コマンドを使用します。
# /usr/local/apache/bin/apachectl stop
apache サーバが受け取るシグナル:
SIGHUP | apache の初期化を行わせる働きを持っています。 すべての設定ファイルを再読み込みし、活動中の分身サーバも含め、すべての分身プロセスを一旦終了し再立ち上げします。 |
SIGUSR1 | SIGHUP を送ると、活動中(つまり現在やり取りを行っている最中)の apacheサーバも含めて再起動されてしまい、ブラウザ側では「突然接続が切れた」というような状況になってしまいます。 これに対して SIGUSR1では、分身サーバに対して終了することを要請します。要請を受けた分身サーバは、現在のやり取りを終了した上で再起動してくれます。 このことにより突然接続が切れたりすることなく apache の初期化を行うことができます。 |
6.6 動作確認
すべての設定が完了し apache が無事起動されたら、Web ブラウザを使用し apacheが動作しているサーバーの URLを指定して実際に接続確認をしてみましょう。 httpd.conf で指定した logファイルの内容も確認しましょう。
7.CGI で掲示板やチャットを作る時の注意
CGI を使いたいと思う理由の一つに、掲示板を作りたい(使いたい)ということがあげられます。掲示板は、インターネットでコミュニケーションを楽しむ手段として広く利用されています。しかし、せっかく開いた掲示板に悪戯されたり、悪用されることがあります。それでは、掲示板を気持ちよく利用できるようにするには、どのような作りにすれば良いのでしょうか?掲示板の悪戯対策には、いろいろな方法があります。しかし、あれもこれも設定してしまうと、使いづらかったり、サーバーに多くの負荷がかかってしまいパフォーマンスが落ちてしまいます。また、完全に悪戯等を防げるわけではありません。これらを踏まえて、掲示板を作る上でどんな対処をしたら良いのか最低限必要な項目を上げていきます。
掲示板に書かれた内容を保存しておくデータファイル
データファイルへの悪戯は、いままでの会話の記録を消したり、改ざんしたりします。これらを防ぐには、データファイルを簡単にわからないところに作るようにします。特に、CGI と同じ場所に置いてはいけません。次に、CGI 以外から書き込みが出来ないようにファイルのモード(パーミッション)を設定します。chmod コマンドを利用します(chmod 644 data-file)。
書き込めるメッセージに制限を設ける
自分でサーバーを立ち上げている人は、いくらでも HomePage にディスクサイズを割り当てられますが、プロバイダーを利用している人は
HomePage の為に利用できるディスクサイズに制限があります。そこで、一度に掲示板に書き込めるメッセージのサイズに制限を設ける必要があります。もし、メッセージのサイズに制限がなかったら非常に大きなサイズの文章を入力され、それ以降掲示板が利用できなくなる恐れがあります。無限に連続して投稿されたら同じなので、同じユーザーもしくは
IP Address からの投稿の回数を一定時間内に ##回と決めておくのも必要かも知れません。
if ( grep(/排除したい言葉/,$FORM{'value'}) || grep(/排除したい単語/,$FORM{'value'})) { &error('不適切な文章','内容を確認してください'); }
HTML タグの使用禁止
掲示板のメッセージを記述する欄に、むやみに HTMLのタグを利用できるように許可することはお勧めできません。なぜなら、文字の大きさを変えるタグなどを利用して文字を大きくしたが、タグを閉じ忘れたりしたら、それ以降大きなフォントのまま表示され読みにくくなってしまう可能性があるからです。URLのリンクは許可したいと考えるなら、URL を記述できる欄を特別に設けることをお勧めします。
他人を中傷するような内容を防ぐ手段を設ける
掲示板 CGIでは、掲示板を利用した人のホスト名(IP Address)や時間といった情報をログとして取得することができます。また、掲示板を利用した人がプロバイダー(ISP)を利用していた場合、プロバイダーには何時何分に何処の人がどのホスト名(IP
Address)を利用したかがわかります。これらを照らし合わせることにより、どの人が掲示板を利用したか特定ができます。そのため、匿名性が無くなるので他人の中傷をむやみに記述しません。
しかし、匿名proxyというものが存在しています。これは、普段ブラウザーが吐き出している情報を削除したり、直接利用しているプロバイダーを隠すことができます。このことで、掲示板利用者の情報が非常に少なくなってしまうため、追跡を多少困難に
この、匿名 proxy の利用者の書き込みを禁止することで、ある程度、モラルを持った利用者を誘導することができます。
ここでは詳しく書きませんが、それらは、HTTP_X_FORWARDED_FOR、HTTP_FORWARDED、HTTP_VIA、HTTP_SP_HOST、 HTTP_CLIENT_IPといった変数を調べる($ENV{'HTTP_USER_AGENT'} ...)ことによって行います。ただし、これらを調べてもすべてが調べられるわけではありません。また、あまり神経質になり過ぎて使いにくい掲示板にしてしまっては...ということにもなるので、自分の納得いくレベルで CGI を記述してください。
8.検索サイトと Webサイト
作成した Web サイトを、Yahoo, goo, Infoseek といった検索サイトに登録して多くのユーザーに情報を公開できるようにします。逆に、情報をあまり公開したくないページもあります。しかし、なんの設定もしないと、goo, Infoseek といったロボット型の検索サイトに全てのページの索引を作られてしまいます。これを避けるにはどうしたら良いのでしょうか?それには、いくつか方法がいくつかあります。ただし、どの方法も全てのロボット型検索サイトに有効なわけではありません。
8.1 robot.txt を利用する方法
この方法は、非常に簡単で robot.txt ファイルをテキストエディタで作成し Document Rootディレクトリーに置いて置くことで実現できます。しかし、Document
サイトのすべてのページの索引化を拒否する場合 | |
User-Agent: * | 検索ロボットを指定します。すべての検索ロボットが対象の場合は「*」を指定します。 |
Disallow: / | 索引化されたくないディレクトリを指定します。全てのページなので「/」を指定します。 |
索引化されたくないディレクトリ(ページ)が一部である場合 | |
User-Agent: * | |
Disallow: /cgi-bin/ | 索引化されたくないディレクトリを指定します。 |
Disallow: /img/ | 索引化されたくないディレクトリを指定します。 |
特定の検索ロボットのみの索引化を許す場合 | |
User-Agent: * | まず、全ての検索ロボットを対象にします。 |
Disallow: / | 全てのページを索引かされないように指定します。 |
User-Agent: Lycos | 次に、索引化を許す検索ロボットを指定します。 |
Allow: / | 続いて、許可するディレクトリも設定します。 |
8.2 Robots Metaタグを利用する方法
この方法は、robot.txt ファイルを利用できない場合に使用します。Robots Meta タグは、対象となるHTMLファイル全てに記述する必要があります。
記述方法 | |
meta name="robots" | Robots Metaタグであることを定義しています。 |
content="[no]index,[no]follow" | ページ索引化/リンク追跡の許可を指定します。 |
記述の種類 | |
<meta name="robots" content="index,follow"> | ページの索引化を許可,ページのリンクの追跡許可 |
<meta name="robots" content="index,nofollow"> | ページの索引化を許可,ページのリンクの追跡拒否 |
<meta name="robots" content="noindex,follow"> | ページの索引化を拒否,ページのリンクの追跡許可 |
<meta name="robots" content="noindex,nofollow"> | ページの索引化を拒否,ページのリンクの追跡拒否 |
どちらも拒否する際の記述例 | |
<html> |
Robots Meta タグは、逆にロボット型の検索サイトに索引を作成してもらうようにすることが出来ます。
記述方法 | |
meta name="keywords" | 検索キーワードを定義する。 |
content="キーワード1,キーワード2,..." | キーワードとなる単語を入れる。(カンマ区切り) |
検索結果のページの説明文 | |
meta name="description" | ページ説明文であることを定義する。 |
content="ページの説明文" | 検索結果で表示されるページの説明文を記述する。 |
記述例 | |
<meta name="keywords" content="java,jini,jiro"> | キーワード「java, jini, jiro」を認識させる。 |
<meta name="description" content="Java のページです。"> | 検索結果に表示させる説明文の内容を記述する。 |
8.3 .htaccessファイルを利用する方法
この方法は、ディレクトリー単位にアクセス権の設定などをする場合に利用できます。ただし、利用するには、HTTPサーバーの設定で htaccessファイルでのアクセス制御を許可している必要があります。.htaccess
特定のアドレスからのアクセスのみ許可する場合 | |
「192.168.1.*」からのアクセスのみを許可する | |
order deny,allow | 制限してから、許可するホストを指定する。 |
deny from all | まず、全てのホストを許可しない。 |
allow from 192.168.1. | 次に、許可するホストを指定する。 |
特定のアドレスからのアクセスを拒否する場合 | |
「192.168.0.10」「192.168.0.11」からのアクセスを拒否する | |
order allow,deny | 許可してから、制限するホストを指定する。 |
allow from all | まず、全てのホストを許可する。 |
deny from 192.168.0.10 192.168.0.11 | 次に、拒否するホストを指定する。 |
.htaccess によってアクセス権を設定するのは良いが、.htaccess ファイルの内容が見られてしまうのは困ります。そこで、httpサーバーの設定(access.conf,
httpd.conf)で .htaccess ファイルを参照できないように設定しておく必要があります(デフォルトで設定されている場合が多い)。
<Files .htaccess> order deny,allow deny from all </Files>
9.httpd が出力するメッセージ
HTTP サーバーが、意図したページを表示せずにあるメッセージを表示する場合があります。その、メッセージの意味について一部説明します。
100 Continue (継続) 101 Switching Protocols (プロトコル変更) 200 OK (OK) 201 Created (作成) 202 Accepted (承認) 203 Non-Authoritative Information(許可のない情報) 204 No Content (コンテンツが無い) 205 Reset Content (コンテンツリセット) 206 Partial Content (部分的コンテンツ) 300 Multiple Choices (複数選択肢) 301 Moved Permanently (移動) 302 Moved Temporarily (一時的移動) 303 See Other (他を参照) 304 Not Modified (変更なし) 305 Use Proxy (プロキシーの使用) 400 Bad Request (不正リクエスト) 401 Unauthorized (許可なし) 402 Payment Required (支払いが必要) 403 Forbidden (閲覧権限がない) 404 Not Found (存在しない) 405 Method Not Allowed (許可されていないメソッド) 406 Not Acceptable (許可できず) 407 Proxy Authentication Required(プロクシー承認が必要) 408 Request Time-out (リクエスト・タイムアウト) 409 Conflict (コンフリクト) 410 Gone (無い) 411 Length Required (長さが足りない) 412 Precondition Failed (準備失敗) 413 Request Entity Too Large (対象が大きすぎる) 414 Request-URI Too Large (URIが大きすぎる) 415 Unsupported Media Type (サポートされていないファイルタイプ) 500 Internal Server Error (内部サーバーエラー) 501 Not Implemented (インプリメントされていない機能) 502 Bad Gateway (不正なゲートウェイ) 503 Service Unavailable (サーバーダウン) 504 Gateway Time-out (ゲートウェイ・タイムアウト) 505 HTTP Version not supported (サポートされていない HTTPのバージョン)
10.その他の Tips
他の URI (URL) にジャンプ
#!/usr/local/bin/perl print "Location: http://www.domain.com/foo/bar/\n\n";
CGIによるダウンロード
#!/usr/local/bin/perl use strict; my $file_name = "sample.data"; my $file_size = -s $file_name; print "Content-Type: application/octet-stream\n"; print "Content-Disposition: attachment; filename=$file_name\n"; print "Content-Length: $file_size\n\n"; open(FILE, $file_name); while ( <FILE> ){ print; } close (FILE);