.htaccessとは?
.htaccessはドキュメントルート配下のディレクトリに設置するファイルでディレクトリごとにサーバ設定を変更することができます。.htaccessはwebサーバにapacheを使用している場合のみ利用することができます。nginxやIISを利用している場合は使えません。
どんな時に使う?利点と欠点
.htaccessを使用する利点は「一般ユーザでもサーバ設定を変更可能」であることです。
ttpd.confなどのサーバconfは通常rootユーザしか変更できない/etc/配下にありますが、.htaccessはドキュメントルート配下に設置するファイルですので、許可された一般ユーザでも設定の変更ができます。
欠点としては
- 設定の管理が複雑になる(設定ファイルが散らばる)
- .confファイルよりも優先されるので一括した設定変更が難しくなる
- コンテンツ更新によリ頻繁に書き換えが起こるディレクトリなので誤って削除されたり更新されやすい
- 文法チェック機能がないので記法を誤った.htaccessを設置すると500 internal server errorになるなど障害の原因になりやすい
- ディレクトリ階層ごとに.htaccessのチェックが行われるのでパフォーマンスが低下する
- セキュリティ上の問題
等があります。
公式でも基本的には必要な場合を除いて積極的な利用は推奨されていません。
.htaccess
ファイルはコンテンツ提供者がディレクトリ毎の 設定を行ないたいけれど、サーバシステムの root アクセス権限を持っていない という場合にのみ使うべきものです。https://httpd.apache.org/docs/current/howto/htaccess.html
ディレクトリごとの設定を変更したい場合は、サーバ主設定ファイル中で<Directroy></Directory>ディレクティブ中に設定を追記する方法が推奨されています。
.htaccessの使い方
AllowOverride Allで.htaccessの利用許可
.htaccessを使用するにはまずサーバ設定ファイル側で許可を与える必要があります。
バーチャルホストごとやディレクトリごとに設定を変更できます。
AllowOverride Noneとすると.htaccessの利用を無効化できます。使用許可するにはNoneをAllに変更します。
<VirtualHost *:80>
ServerName example.com
DocumentRoot /var/www/example.com/htdocs
<Directory /var/www/example.com/htdocs>
DirectoryIndex index.html index.php
Options FollowSymLinks Includes
AllowOverride None
Require all granted
</Directory>
</VirtualHost>
httpd.confを見ると/var/wwwなどはAllowOverride Noneに設定されています。
.htaccessの優先順位
.htaccessは設置されたディレクトリの上の階層の設定やサーバconfファイルの設定を上書きします。
/var/www/htdocs/.htaccessの設定は、/var/www/.htaccessの設定内容やhttpd.confファイルの設定を上書きします。
ただし、上書きされる内容はAllowOverrideの設定内容によって変化します。
- All すべての上書き設定を許可する
- Limit ホストへのアクセス制御を行うAllow / Deny (require ip ..)などのディレクティブの使用を許可する
- AuthConfig 認証に関するディレクティブの使用を許可する
深い階層の.htaccessは上位の階層の設定を上書きするので複数のVHを持つサーバや多階層のウェブサイトの場合は管理が煩雑になりがちなので.htaccessではなく、各VHの.confファイルを用意して</Directory>ディレクティブで制御するのがおすすめです。
.htaccessでBasic認証
.htaccessでよく使う機能としては、リダイレクト設定やBasic認証があります。
Basic認証は.confファイルでも設定できますが、開発中の環境などでディレクトリごとに細かく公開/非公開の設定を行いたい場合は.htaccessは便利です。
AuthType Basic
AuthName "This page is required password"
AuthUserFile /www/passwords/.htpasswd
AuthGroupFile /dev/null
Require valid-user
CGIを許可する
サーバ設定全体ではCGIの実行を不許可としていても.htaccessで特定のディレクトリのみ一時的にCGIプログロムの実行を許可したい場合は.htaccessが便利です。
Options +ExecCGI
SetHandler cgi-script
*上記を有効化するには.confファイルでAllowOverride OptionsとAllowOverride FileInfoを有効にする必要がある。
.htaccessが有効か確認したい!
.htaccessが有効かどうか確認する簡単な方法は適当なことを書いた.htaccessを設置することです。
internal server errorが発生した場合は.htaccessは有効です。
internal server errorを表示したくない、できない場合は適当にBasic認証を出す設定やリダイレクトなどの設定をいれます。
サーバconfが確認できる場合は.conf中のAllowOverrideの設定を確認しましょう。
セキュリティのために.htaccessへのアクセスを拒否する
ドキュメントルート配下に設置するため、設定によってブラウザ上から.htaccessファイルを閲覧できてしまうことがあります。これを防ぐために.htaccessや.htpasswdファイル等のファイルへのアクセスを拒否する設定を追記します
<Files ~ "^\.ht">
Require all denied
</Files>