Apache HTTP サーバ バージョン 2.4
Apache チュートリアル: .htaccess ファイル
.htaccess
ファイルはディレクトリ毎に設定を変更する方法を
提供します。
.htaccess ファイル
関連モジュール | 関連ディレクティブ |
---|---|
.htaccess ファイルとは何か/その使い方
.htaccess
ファイル (「分散設定ファイル」) は
ディレクトリ毎に設定を変更する方法を提供します。ディレクティブの
書かれたファイルをディレクトリに置くことで、そのディレクトリとその
サブディレクトリすべてにディレクティブを適用させることができます。
注:
.htaccess
ファイルを別の名前にしたい場合は、
AccessFileName
ディレクティブを
使って変更することができます。例えば、そのファイルを .config
という名前にしたい場合は、以下の設定をサーバ設定ファイルに入れることが
できます:
AccessFileName .config
一般に、.htaccess
ファイルの構文は
主設定ファイル
と同じです。これらのファイルに書くことのできるディレクティブは AllowOverride
ディレクティブにより決まります。
このディレクティブは、.htaccess
ファイルに
書かれたディレクティブの中で、、
どのディレクティブが適用されるかをカテゴリー単位で指定します。
.htaccess
に書くことのできるディレクティブであれば、
説明文書には「上書き」という項目があり、.htaccess に書くことができるように
なるための AllowOverride
の値が指定されています。
例えば、AddDefaultCharset
ディレクティブの説明を
見ると、.htaccess
ファイルでの使用が許可されていることが
わかります。 (ディレクティブの概要の所にある「コンテキスト」と書かれている
行を見てください。) 上書きと書かれている行には
FileInfo
とあります。ですから、.htaccess
中の
このディレクティブが有効になるためには、少なくとも
AllowOverride FileInfo
が設定されている必要があります。
あるディレクティブを .htaccess
ファイルに書くことができるか
どうかわからないときは、そのディレクティブの説明を探して、".htaccess"
のための「コンテキスト」の行を調べてください。
いつ .htaccess ファイルを使う(使わない)か。
一般的に、サーバの主設定ファイルにアクセスできない場合を除いて、
.htaccess
ファイルの使用は極力避けてください。
世の中には、例えば、ユーザ認証は常に .htaccess
ファイルで
行なわなければならない、という誤解が広まっていますが、まったくそんなことは
ありません。ユーザ認証の設定はサーバ主設定ファイルに書くことができ、
実際、その方がより良い設定方法です。
.htaccess
ファイルはコンテンツ提供者がディレクトリ毎の
設定を行ないたいけれど、サーバシステムの root アクセス権限を持っていない
という場合にのみ使うべきものです。サーバ管理者が頻繁に設定変更を行ないたくは
ない、というときには個々のユーザが .htaccess
ファイルを使って
自分で設定の変更を行なうことを許可した方が良いときもあるでしょう。
これは特に、ISP が複数のユーザのサイトを一つのマシンでホストしていて、
各ユーザが設定の変更をできるようにしたいようなときにあてはまります。
しかし、普通は可能であれば .htaccess
ファイルの使用は
避けてください。.htaccess
ファイルに書こうと考えるような
すべての設定は、サーバの主設定ファイルの <Directory>
セクションで同じように行なうことが
できます。
.htaccess
ファイルの使用を避ける理由は主に二つあります。
一つ目はサーバの性能の問題です。AllowOverride
ディレクティブが
.htaccess
ファイルの設定を許可している場合は、Apache は
各ディレクトリで .htaccess
ファイルを探します。
ですから、.htaccess
ファイルを許可すると、実際に使用しているか
どうかに関わらず、性能の低下を招くことになります! また、.htaccess
ファイルは文書がリクエストされる度に読み込まれます。
さらに、Apache は適用すべきディレクティブを集めるために、すべての
上位のディレクトリの .htaccess
ファイルを探す必要があることにも
注意してください。(ディレクティブが適用される方法を
参照してください。)ですから、/www/htdocs/example
にある
ファイルがリクエストされたときは、Apache は以下のファイルを調べます。
/.htaccess
/www/.htaccess
/www/htdocs/.htaccess
/www/htdocs/example/.htaccess
ですから、そのディレクトリのそれぞれのファイルへのアクセスに対して、
上の例のファイルがまったく存在しないときでも、追加のファイルシステムの
アクセスが行なわれることになります。(これは、.htaccess
が
/
に対して有効になっているときの場合で、普通はそうなって
いないことに注意してください。)
二つ目はセキュリティです。ユーザにサーバの設定を変更することを
許可することになりますので、あなた自身が管理できない変更をされる
恐れがあります。ユーザにこの特権を与えるのが良いのかどうか、十分
検討してください。また、ユーザに与える権限が必要なものよりも少なすぎると、
余分な技術サポート報告を受け取るようになる可能性が高いことにも
注意してください。確実に、ユーザにどの程度の権限を与えたか明確に告げるように
してください。AllowOverride
に
何を設定したかということと、関連する文書を示すことで、
後々の混乱をぐっと減らすことが
できます。
ところで、ディレクティブの書かれた .htaccess
を
/www/htdocs/example
に置くことと、同じディレクティブを
主サーバ設定の Directory セクション
<Directory /www/htdocs/example>
に書くことは
完全に等価です:
/www/htdocs/example
の .htaccess
ファイル:
/www/htdocs/example
の .htaccess ファイルの
内容
AddType text/example .exm
httpd.conf のセクション
file
<Directory /www/htdocs/example>
AddType text/example .exm
</Directory>
しかし、この設定はサーバ設定ファイルに書いた方がパフォーマンスの 低下が少なくなります。ファイルがリクエストされる度に 読み込まれる代わりに、Apache の起動時に 1 回だけ読み込めば よくなるからです。
AllowOverride
ディレクティブの
値を none
に設定することで .htaccess
ファイル
の使用を完全に無効にすることができます。
AllowOverride None
ディレクティブの適用のされ方
.htaccess
ファイルの設定ディレクティブは .htaccess
ファイルの存在するディレクトリと、そのサブディレクトリすべてに適用されます。
しかし、上の階層のディレクトリにも .htaccess
ファイルが
存在するかもしれないことを覚えておくことは大切です。ディレクティブは現れる
順番に適用されます。ですから、あるディレクトリの .htaccess
は
ディレクトリツリーのより上の階層の .htaccess
ファイルの
設定を上書きするかもしれません。そして、その .htaccess
も
より上の階層で書かれたディレクティブを上書きしたり、主サーバ設定ファイル
そのものの設定を上書きしたりしているかもしれません。
例:
ディレクトリ /www/htdocs/example1
に以下の内容の
.htaccess
ファイルがあります:
Options +ExecCGI
(注: .htaccess
ファイルで "Options
" ディレクティブが有効になるためには、
"AllowOverride Options
" を有効にする必要があります。)
ディレクトリ /www/htdocs/example1/example2
には
以下のような .htaccess
ファイルがあります:
Options Includes
二つめの .htaccess
により、ディレクトリ
/www/htdocs/example1/example2
では CGI の実行は
許可されません。これは、Options Includes
のみが
効力を持ち、それがすべての以前の設定を上書きするからです。
メイン設定ファイルに対する .htaccess のマージ
As discussed in the documentation on Configuration Sections,
.htaccess
files can override the <Directory>
sections for
the corresponding directory, but will be overriden by other types
of configuration sections from the main configuration files. This
fact can be used to enforce certain configurations, even in the
presence of a liberal AllowOverride
setting. For example, to
prevent script execution while allowing anything else to be set in
.htaccess
you can use:
セクションの設定
に記載されているように、.htaccess
ファイルを使って
<Directory>
セクションの設定をディレクトリ毎に上書きできますが、
メイン設定ファイル中にある、他の種類の設定セクションによって
さらに上書きされることもあります。
この特徴を使って、
AllowOverride
で自由度の高い設定があったとしても、ある特定の設定が確実に
反映されるようにできます。例えば、CGI スクリプトの実行は
不許可に、かつ、.htaccess
でその他の項目は
設定できるように、という場合は次のようにできます :
<Directory />
Allowoverride All
</Directory>
<Location />
Options +IncludesNoExec -ExecCGI
</Location>
認証の例
もし認証の方法を知るためにこの部分に直接来たのであれば、次のことを
知っておくことが重要です。よくある誤解に、パスワード認証を行なうためには
.htaccess
ファイルを使う必要がある、というものがあります。
これは正しくありません。主サーバ設定ファイルの <Directory>
セクションに
認証用のディレクティブを書く方が推奨される方法で、.htaccess
ファイルは主サーバ設定ファイルを変更できないときにのみ使用すべきです。
いつ .htaccess
ファイルを使うべきで、いつ使うべきではないかに
ついては 上を参照してください。
以上のことをふまえた上で、もし .htaccess
の使用が
まだ必要だと思う場合は、次のようなものが望みのことをしてくれるかも
しれません。
.htaccess
ファイルの内容:
AuthType Basic
AuthName "Password Required"
AuthUserFile /www/passwords/password.file
AuthGroupFile /www/passwords/group.file
Require Group admins
これらのディレクティブが有効になるためには、
AllowOverride AuthConfig
が有効でなくてはならないことに
注意してください。
認証と承認については 認証チュートリアルを 参照してください。
SSI の例
もう一つの .htaccess
ファイルのよくある利用法は
特定のディレクトリで SSI を有効にすることです。これは、望みのディレクトリの
.htaccess
ファイルに以下の設定ディレクティブを書くことで
達成できます:
Options +Includes
AddType text/html shtml
AddHandler server-parsed shtml
これらのディレクティブが有効になるためには、
AllowOverride Options
と AllowOverride
FileInfo
が有効になっている必要があることに注意してください。
よりまとまった SSI の説明は SSI チュートリアルを 参照してください。
CGI の例
最後に、特定のディレクトリで CGI プログラムの実行を許可したいことが あるでしょう。これは以下の設定で行なうことができます:
Options +ExecCGI
AddHandler cgi-script cgi pl
もしくは、あるディレクトリのすべてのファイルが CGI プログラムと みなされるようにしたいなら、以下の設定で実現することができます:
Options +ExecCGI
SetHandler cgi-script
これらのディレクティブが有効になるためには、
AllowOverride Options
と AllowOverride
FileInfo
が有効である必要があることに注意してください。
CGI プログラムと設定のよりまとまった説明は CGI チュートリアルを参照してください。
問題解決
設定ディレクティブを .htaccess
ファイルに書いたけれども、
期待した効果が得られないときには、いくつかの原因が考えられます。
一番よくあることは、設定ディレクティブが考慮されるようには
AllowOverride
が設定されていない
というものです。該当のファイルのスコープに AllowOverride None
が設定されていないことを確認してください。これを調べるための良い方法は、
.htaccess
ファイルにごみを書いて、リロードすることです。
サーバのエラーが生成されないときは、ほぼ確実に AllowOverride
None
が設定されている状態になっています。
そうではなく、文書をアクセスしようとしたときにエラーが発生している
ときは、Apache のエラーログを調べてください。.htaccess
ファイルで
使用されたディレクティブが許可されていない、ということを知らせている
可能性が高いです。または、構文の間違いがあることを述べているかもしれません。
その場合にはまずそれを修正する必要があります。