知ってた?ナルホド! BLOG

2019.05.13

.htaccessをApacheから理解する!

WRITTEN BY

 | 

HIRAHARA NATSUMI

.htaccessをApacheから理解する!

こんにちは!コーダーの平原です!

Apacheの分散設定ファイルである.htaccessは、Basic認証やリダイレクト設定など、ディレクトリ単位での設定を行う際に使用します。
.htaccessはサーバーのroot権限を持っていなくても使用でき、記述方法に関しての記事も多い為、私のようにApacheに関しての知識があまり無くても設定することができます。
でもそれを繰り返す限りは、.htaccessを使用する理由や、その設定内容に関しての理解は深められませんし、.htaccessが上手く動作しなかった場合にその原因がわからないなんてこともあり得ます。

なので今回は、.htaccessをApacheから理解していきましょう。

  1. Apacheとは
  2. Apacheの設定ファイルについて
  3. .htaccessの各種設定方法
  4. まとめ

1. Apacheとは

Apache(正式名称 : Apache HTTP Server)とは、オープンソースのWebサーバソフトウェアです。Apacheの公式ページで最新バージョンは2.4系(2019年5月現在)となっています。

Apacheと同様に多くのシェア数を持つWebサーバーソフトウェアに、nginxがあります。
Apacheとnginxの違いは駆動方式にあります。nginxがシングルスレッドモデルのイベント駆動アーキテクチャなのに対し、Apacheはマルチプロセスモデルのプロセス駆動アーキテクチャです。

マルチプロセスモデルのプロセス駆動アーキテクチャとは、接続ごとに自身の複製を作成して、新たなプロセスとして起動する(プロセスをフォークする)ということで、リクエストを処理するごとにリソースが枯渇しメモリがいっぱいになりやすいというデメリットがあります。

ちなみに.htaccessはApacheで使用することができる分散設定ファイルの為、nginxで使用することはできません。
Apacheからnginxへ移行する際などは、Apacheで設定した.htaccessをnginxの設定ファイルに変換する必要があります。
Apacheは、常に使用可能なコアと呼ばれる標準機能の他、多数存在するモジュールを追加することにより、機能拡張が可能です。

2. Apacheの設定ファイルについて

Apacheの設定は、基本的にhttpd.confというファイルで行います。httpd.confに、ディレクティブと呼ばれる命令とその値を指定することで目的に応じた設定が可能です。

.htaccessで行うディレクトリ単位での制御も、基本的にはhttpd.confで設定を行うことが公式で推奨されており、.htaccessを使用する場合というのは、httpd.confの編集を行う為に必要なroot権限が無い場合や、httpd.confの編集を頻繁に行いたくない場合に限ります。

httpd.confと.htaccessは読み込み回数にも違いがあり、httpd.confは、Apacheの起動時に1回読み込まれるだけなのに対し、.htaccessはアクセスごとにファイルが読み込まれます。

httpd.confでディレクトリ単位の制御を行う場合は、<Directory>、<DirectoryMatch>、<Files>、<FilesMatch>、<Location>、<LocationMatch>などのディレクティブとその値を指定する必要があります。
対して.htaccessでは、.htaccessファイルを配置したディレクトリと、その配下のサブディレクトリに対するアクセスに対してのみ適応されます。

3. .htaccessの各種設定方法

.htaccessでは、httpd.conf内のAllowOverrideディレクティブで指定されたディレクティブのみ有効となります。
.htaccessを正しい記述内容で設定したのに機能しない場合などは、AllowOverrideディレクティブによって.htaccessが無効化されているか、ディレクティブが制限されている可能性があります。

HTTPで定義された、Webサイトの認証方式の一つであるBasic認証(Basic Authentication)を設定する場合は以下のようになります。

AuthType Basic
AuthGroupFile /dev/null
AuthName "Please enter your ID and password"
AuthUserFile サーバーのルートディレクトリからのパス/.htpasswd
require valid-user

.htpasswdファイルでは、ユーザー名とパスワードの組みをコロン(:)で繋ぎ、Base64というエンコード方式で送信します。

ユーザー名:パスワード(符号化したもの)

.htaccessファイルや、htpasswdへのアクセスを拒否する設定は以下のようになります。

<files ~="" "^\.(htaccess|htpasswd)$"="">
deny from all
</files>

恒久的なリダイレクト(301:Moved Permanently)を行い、URLを1つに統一する場合の設定方法を目的に分けてご紹介します。

httpからの通信を、httpsに301リダイレクトする場合。↓↓↓

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</IfModule>

www有りからの通信を、www無しのhttpsに301リダイレクトする場合。↓↓↓

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.example\.com
RewriteRule ^(.*) https://example.com/$1 [R=301,L]
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</IfModule>

%{HTTPS}、%{HTTP_HOST}、%{REQUEST_URI}はサーバーの変数名です。

.htaccessでリダイレクトの設定を行う場合、<IfModule mod_rewrite.c></IfModule>でmod_rewriteというモジュールが利用可能な環境でのみタグ内の設定を読み込むことで、mod_rewriteが利用できない環境であった場合のエラーを回避することができます。

ちなみに.htaccessは、ApacheのAccessFileNameディレクティブと変更するファイル名を、httpd.confで指定することでファイル名を変更することが可能です。
開発環境や本番環境など、置かれた環境によって有効になるファイル名の設定をしたい場合などに便利ですね。

4. まとめ

.htaccessは、ディレクトリ単位での制御を行う為のApache特有のファイルであり、基本的にはApacheのhttpd.confファイルを使用することが推奨されていることがわかりました。
ですが、やはり状況に応じて.htaccessを設定する必要がある場合もあります。その時に、Apacheのモジュールやディレクティブを理解した上で目的に応じた記述をすれば、.htaccessを正しく機能させることができるのですね。

PAGE TOP