Linuxサーバー管理入門 - Linuxサーバー管理でPerlを使う

Apacheの情報 | CentOSサーバー構築

.htaccessとは / Apacheメモ

 .htaccessとは簡単にいうとApacheの設定ファイルを上書きするためのファイルです。Apacheの基本的な設定はhttpd.confで行います。この設定に何か追加が必要な場合は対象のディレクトリ.htaccessファイルを置くことで設定を変更したり、上書いたりすることができます。

 .htaccessファイルにはhttpd.confで記述したディレクティブの一部を記述することができます。どのディレクティブを記述することができるかはマニュアルに記載があります。たとえばRedirectディレクティブの場合を見てみましょう。

Redirectディレクティブ

http://httpd.apache.org/docs/2.0/ja/mod/mod_alias.html#redirect

 項目にコンテキストというものがあります。この部分に.htaccessという項目があれば.htaccessで記述することのできるディレクティブであるということがわかります。

.htaccessの効果のある範囲

 .htaccessは.htaccessを置いたディレクトリとサブディレクトリのすべてに対して効果を持ちます。.htaccessを置いたディレクトリだけに効果があるのではないので注意しましょう。

.htaccessは基本的には使わない

 .htaccessを使用する必要があるのは基本的にレンタルサーバなどを借りていて自分でWebサーバを構築していない場合だけです。この場合はhttpd.confを自分で設定することができないからです。

 各ディレクトリにhttpd.confを置くとApacheがこのファイルを参照するためパフォーマンスが落ちるようです。ですので、自分でサーバを構築している場合はhttpd.confに設定を書くようにします。

 .htaccessを使う一番多い場面はアクセス制御を行う場合です。データを格納しておくファイルを置くディレクトリなどインターネットに公開したくないディレクトリに対して.htaccessを使用すればアクセス制御を行うことができます。

.htaccessに一般的に抱くイメージ

 また.htaccessという名前から多くの人が誤解してしまうのは、.htaccessはアクセス制御のためのファイルだということです。ここで解説したようにこれは間違いで、.htaccessはhttpd.confの設定を上書きするためのファイルです。アクセス制御はひとつの機能として行うことができるだけで.htaccessがアクセス制御のためのファイルなのではありません。

ScriptAlias CGIを実行するURLとディレクトリのマッピング

 ScriptAliasはCGIを実行するURLとディレクトリをマッピングするためのディレクティブです。

http.confの中でデフォルトで次のように設定されているはずです。

ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"

 この記述を行うと/var/www/cgi-bin/配下のファイルはCGIスクリプトであるとみなされます。また/cgi-bin/というURLが/var/www/cgi-bin/にマッピングされます。たとえば

/var/www/cgi-bin/sample.cgi

というCGIスクリプトはブラウザから

http://somehost/cgi-bin/sample.cgi

というURLで実行することができます。

アクセス制御

アクセス制御の基本

 Apacheのアクセス制御の考え方を最初に書いておきます。まずWebサーバの設定でインターネットに対して公開するためのディレクトリというものを指定します。これがドキュメントルートと呼ばれるディレクトリになります。ドキュメントルート配下のディレクトリインターネット上に公開されたどの人もファイルの内容を見ることができます。

 反対にドキュメントルート配下に置かれていないファイルはインターネット上から見ることはできません。

 ドキュメントルートの設定はhttpd.confでDocumentRootディレクティブによって行います。

<h3> ドキュメントルートを指定するための設定</h3>
DocumentRoot "/var/www/html"
<h3>上のように記述すると /var/www/html だけがインターネットに公開される</h3>
+--root--+--dir1
|        |
|        +--dir2
|
+--etc--+--dir1
|       |
|       +--dir2
|
+--var--www--+--html <--このディレクトリ配下だけがインターネットに公開される
             |
             +--error
             |
             +--data

 /var/www/html配下のすべてのファイルをインターネットから見ることができ、それ以外のディレクトリはインターネットから見ることができません。

インターネットから見えても良いファイルと見えてはいけないファイル

 インターネットから見えても良いファイルと見えてはいけないファイルがあります。見えても良いファイルはHTMLファイル(.html)、画像ファイル(.gif,.jpeg,.png)、動画ファイル(.mgg)、JavaScript(.js)、CSSファイル(.css)などです。

 これらは公開してこそ意味があるファイルなので当然といえば当然です。

 反対に見えてはいけないファイルはCGIスクリプト(.cgi)、PHPの実行ファイル(.php)、JSPファイル(.jsp)などの実行ファイルです。これらは実行されなければならず中身を見られてはいけません。これらのファイルにアクセスされた場合はそのスクリプトを実行する設定を行う必要があります。

 もうひとつ見られてはいけないファイルはスクリプトからアクセスするデータを格納するファイルです。これにはMySQLのデータベースファイルなどがあります。またデータベースに接続するパスワードを格納したファイルも見られてはいけません。

 このようなファイルにはインターネットからアクセスできないようにアクセス制御を行う必要があります。

アクセスを拒否する設定

 ひとつの例としてdataというディレクトリに対してアクセスを拒否する設定を行います。ファイルの構成としてはdataディレクトリ配下に.htaccessを置きます。そしてこの.htaccess1の中にアクセスを拒否する設定を行います。

var--www--html--+--index.html
                |
                +--img--+--image1.png
                |       |
                |       +--iname2.png
                |
                |
                +--data--+--data.txt
                         |                  
                         +--password.txt
                         |
                         +--.htaccess   .htaccessを適切に記述するとdata配下の
                                        ファイル(data.txtとpassword.txt)
                                        にアクセスできなくなる。

.htaccessファイルはの記述は次のようになります。

Deny form all

 これはすべてのIPアドレスからのアクセスを拒否するという意味になります。これでdataディレクトリ配下へのアクセスはできなくなります。

.htaccessの配置する場合の注意点

 .htaccessに関する注意点がひとつあります。それはApacheのデフォルトの設定ではドキュメントルート配下での.htaccessの設置は意味を持たない設定になっているということです。これでは.htaccessを設定しても意味がありません。

 ですので.htaccessのアクセス制御に関するディレクティブだけが意味を持つような設定にhttpd.confを書き換える必要があります。

 ドキュメントルートのディレクトリのAllowOverRideの部分がNoneという.htaccessを無効にする設定になっているので、Limitというアクセス制御のディレクティブだけが意味を持つように変更します。

<Directory "/var/www/html">
    #
    # ...

    AllowOverride None

    #
    # ...

</Directory>

 これを以下のように変更します。

<Directory "/var/www/html">
    #
    # ...

    AllowOverride Limit

    #
    # ...

</Directory>

ドキュメントルート配下でCGIの実行を許可する

 デフォルトではドキュメントルート配下でCGIを実行することができません。ドキュメントルート配下でCGIを実行するためには以下の設定をhttpd.confファイルで行います。

ExecCGIをドキュメントルートのOptionsディレクティブに追加

 ExecCGIをドキュメントルートのOptionsディレクティブに追加します。次の例はドキュメントルートが「/var/www/html」の場合の例です。

 デフォルトでは以下のようになっています。

<Directory "/var/www/html">

#
<h3> ..</h3>

    Options Indexes FollowSymLinks

#
<h3> ..</h3>

</Directory>

 OptionsディレクティブにExecCGIを追加します。

<Directory "/var/www/html">

#
<h3> ..</h3>

    Options Indexes FollowSymLinks ExecCGI

#
<h3> ..</h3>

</Directory>

 これでドキュメントルート配下でCGIを実行することができるようになります。

拡張の動作に関する設定

 「.cgi」という拡張の場合はCGIスクリプトとして実行される設定を行うには「AddHandler」ディレクティブを使用します。これはApacheのデフォルトの設定のはずですので確認だけしておきましょう。以下のような記述がhttpd.confの中にあるはずです。

AddHandler cgi-script .cgi

Apacheのバージョンを調べる

 Apcaheのバージョンを調べるには「httpd -v」を使用します。

httpd -v

 次のような出力を得ることができます。

Server version: Apache/2.2.8 (Unix)
Server built:   Jan 24 2008 10:44:19

バーチャルホストで複数IPアドレスに対応した複数のパスの設定

 バーチャルホスト複数IPアドレスに対応して複数パスの設定を行う例です。

<VirtualHost *:80>

    ProxyPass /app1 http://localhost:3000
    ProxyPassReverse /app1 http://localhost:3000

    ProxyPass /app2 http://localhost:3001
    ProxyPassReverse /app2 http://localhost:3001

</VirtualHost>

 「*:80」と指定することですべてのIPアドレスからの80番ポートへの接続を受けることができます。リバースプロキシとして設定するので「ProxyPass」と「ProxyPassReverse」の両方を指定します。