Apache HTTP Serverのディレクトリ別設定ファイル.htaccess

概要
Apache HTTP Server (httpd) には設定ファイルの.htaccessが存在する。このファイルについてちゃんと理解できていなかったので整理する。
Apache HTTP Server v2.4の公式マニュアルの「Apache HTTP Server Tutorial: .htaccess files – Apache HTTP Server Version 2.4」を参考にした。
Apacheには2種類のhttpd.confと.htaccessの2種類の設定ファイルが存在する。httpd.confはサーバー全体の設定であり,.htaccessはディレクトリー単位の設定ファイルとなっている。.htaccessはファイルが置かれたディレクトリー以下に対して有効な設定となる。httpd.confでの<Directory>ブロック相当の設定を行なえる。
.htaccessが存在すると,配下のファイルのリクエストの度に.htaccessが読み込まれる。そのため,パフォーマンスの観点から,できるだけ.htaccessを使わずにhttpd.confで設定することが公式で推奨されている。
用途
公式で推奨されていない.htaccessだが,以下の3の利点がある。
.htaccessの利点- レンタルサーバーなど管理者権限の使えないサーバー環境で設定が可能
- サーバーを停止させずに設定が可能
- ディレクトリーごとのきめ細かな設定が可能
一番重要なのが1点目だ。レンタルサーバーは格安でWebサービスを運営できるのだが,サーバーを共有しているため,当然ながら管理者権限が使えず,httpd.confを編集できない。その際に,.htaccessは管理者権限不要で設定ができることから,使用可能なケースが多い。そのため,レンタルサーバーでのサーバー設定では.htaccessを使うしかない。
なお,.htaccessのファイル名はAccessFileName指令で以下のように変更することができる。
AccessFileName .configただ,.htaccessで一般的に名前が通っているので,下手に名前を変えずにそのまま.htaccessのファイル名を使ったほうがいいだろう。
.htaccessで指定可能な指令
.htaccessの設定は基本的にhttpd.oonfと同じだ。ただし,httpd.confで使える指令が何でも指定可能なわけではない。
.htaccessで指定可能な指令 (ディレクティブ: directive) はhttpd.confで指定されたAllowOverride指令とAllowOverreideList指令で決まる。
それぞれ,.htaccessで上書き可能な指令をAllowOverride指令はカテゴリー単位,AllowOverrideList指令は指令単位で指定する。
.htaccessで上書き可能な指令の可否は,指令の説明の上書き (Override) 欄で判断する。この欄に,AllowOverride指令のカテゴリーが記されている。その都度,確認するのが手間であれば「.htaccessで使用可能な指令一覧」に全一覧を掲載しているので,こちらも参考にする。
逆に,AllowOverride指令とAllowOverrideList指令で指定されていない指令を.htaccessで指定すると,Internal Server Errorが発生して,その配下のページを応答できないので注意する。
なお,AllowOverride指令とAllowOverrideList指令のデフォルト値はNoneであり,両方ともNoneの場合,.htaccessの読み込みを完全に無視し,読み込み処理も省略されるためApacheの性能が向上する。
AllowOverride指令の値
AllowOverride指令で指定可能な値はAll, None, AuthConfig, FileInfo, Indexes, Limit, Nonfatal, Optionsのいずれかだ。
この内,Allは全てのカテゴリーを意味し,Noneはどのどのカテゴリーも指定しないことを意味する。残りの値はそれぞれのカテゴリーを意味する。
ここで,AllowOverride指令には何の値を指定すべきかという問題がでてくる。.htaccessを使う予定がなければ,デフォルトのNoneでよい。.htaccessを使う場合,以下の値を推奨する。
AllowOverride AuthConfig FileInfo Indexes Limit
ここで指定されなかったカテゴリーとその理由は以下の通りとなる。
Options:Options指令とXBitHack指令だけが属している。この内,Options指令のFollowSymLinksなどがWebサーバーの任意のファイルへのアクセスを許可するため,httpd.confで一元管理したほうがいい。Nonfatal:.htaccessの構文エラーを許可し,代わりにエラーログに出力する。ユーザーセキュリティに影響を与える可能性があるため,許可しないほうがいい。
基本的にはどの指令もユーザーが使う可能性がある。ただし,OptionsとNonfatalは悪い影響が大きいので,これらは除外したほうがいいだろう。ローカルの開発環境で動作を確認したいだけならば,安全なのでAllでも問題ない。
上記の設定は,後述する通り実際のレンタルサーバーの設定値と同じため,信頼性も高い。
AllowOverride指令の値の確認
レンタルサーバーなどで現在のAllowOverride指令とAllowOverrideList指令の値を把握したい場面がある。
mod_infoが有効な場合 (apachectl -M | grep mod_infoで確認),以下のコマンドで現在設定されているAllowOverride指令とAllowOverrideList指令の値を確認できる (参考: Apache の情報をコマンドラインで取得する – Qiita,mod_info – Apache HTTP Server Version 2.4)。
httpd -t -D DUMP_CONFIG | grep AllowOverride
これで現在のレンタルサーバーの.htaccessで使用可能な指令を確認できる。
実際に,自分が使っているCORESERVERで確認すると,以下のカテゴリーが指定されていた。
AllowOverride AuthConfig FileInfo Indexes Limit
逆に,mod_infoがインストールされていない場合,実際に.htaccessに指令を指定して,エラーの有無で確認するしかないだろう。
結論
.htaccessについて整理した。
レンタルサーバーを使う場合,リダイレクトなどサーバーを設定する際に使うことになる。
今回,.htaccessについてしっかり整理できたので,今度は.htaccessに書き込むmod_rewriteなどのもう少し細かい設定について整理したいと思う。

