.htaccess
は、Apache HTTP サーバーで使われる設定ファイルである(Nginxとは関係ない)。ディレクトリ単位の設定を主な対象とする。
.htaccessとは
.htaccess
とは、Apache HTTP サーバーに対する設定を記述したテキストファイルである。頭の"."は、Un隠しファイルであることを示す。"ht"はHypertextの略だ。
このファイルをディレクトリに配置すると、そのディレクトリ及びそれ以下のディレクトリに設定が適用される。もし配下のディレクトリにも.htaccess
が存在する場合は、そちらが優先される。
もしメインの設定ファイル(httpd.conf
やapache2.conf
など)にアクセスできるのであれば、.htaccess
ではなくそちらを使った方が良い。というか使うべきだ。.htaccess
を使うと遅くなる。
と、ドキュメントに書いてある。
ただ、レンタルサーバーの利用者には難しい(ほとんど無理な)注文だ。
できること
.htaccess
を使うと、例えば以下のようなことができる。
できること | 概要 |
---|---|
リダイレクト | ページAへのアクセスをページBに自動で振り替える。 |
リライトルールの適用 | サーバー上のファイルパスと表示するURLの対応を変更する。 |
パスワード保護 | ユーザー名とパスワードによってアクセスを制限する(=Basic認証)。 |
アクセス制限 | 特定のIPや、Webページからのアクセスを制限する。 |
キャッシュコントロール | 高速化のための各種ファイルデータの保存期間とかを設定する。 |
圧縮の有効化 | コンテンツを圧縮する。 |
SSL化は数時間から数時間経たないと。 ドメインを取得した直後はまだドメインが「浸透」していない。
基本的な書き方
Apache HTTP サーバーの設定ファイルでは、1行に1つのディレクティブ(命令文的なやつ)を書く。
ディレクティブに引数を渡したいときは、半角スペースで区切る。引数がスペースを含むときは、その引数を"
で囲む。なお、ディレクティブは大文字小文字でもよいが、引数は環境による。
また、#
で始まる行はコメントとして理解される。
望む設定を行うには、それぞれのディレクティブとその引数を理解しておく必要がある。
例えば、以下はWordPressでデフォルトで用意されている.htaccess
である。
コメントの部分(先頭に#
のある行)はよいとして、<IfModule mod_rewrite.c>
から下は謎だ。
<>
で囲まれたディレクティブは、複数のディレクティブをグループ化するものである。
<IfModule xxx>
は、引数に渡されたモジュール(=ディレクティブのソースファイル)が存在する場合にのみ、中身のディレクティブを実行する。
各ディレクティブは以下のような意味を持つ。
- RewriteEngine
- 構文:
RewriteEngine on|off
- 意味:リライトエンジンのオンとオフを切り替える。
- 構文:
- RewriteRule
- 構文:
RewriteRule 置換対象のパターン 置換後のパターン [フラグ]
- 意味:リライトルールを指定する。
- 構文:
- RewriteBase
- 構文:
RewriteBase パス
- 意味:置換対象に相対パスを指定する際のベースになるパス。
- 構文:
- RewriteCond
- 構文:
RewriteCond チェック対象の文字列 条件 [フラグ]
- 意味:後続のリライトルールを適用する条件を指定する。
- 構文:
これでだいたいの構造は理解できるはずである。
なお、.*
や^index\.php$
に含まれる変な記号は、正規表現という、文字パターンの表現方法である。また、%{REQUEST_FILENAME}
はApache HTTP サーバーが用意している変数の参照、!-f
や!-d
は、それぞれ単行演算子と呼ばれる演算子の否定形となる。ファイルではない、ディレクトリではない、という意味だ。
こういうのを1つずつ覚えていかねばならない。めっちゃたいへん。コピペでしのぎたい。というかコピペでしのぎながら少しずつ覚えていけばよいと思う。
ちなみにディレクティブの一覧はここ、変数とか演算子の一覧はここにある。
リダイレクトの例
引用元:Redirect
アクセス制限の例
参考元:Require
Basic認証の例
AuthUserFile
に指定するパスは、アクセスされない場所ならどこでもよい。ただ、おそらくサーバー上に"htpasswd"的なディレクトリが用意されているはずなので、その中でよいと思う。ちなみに上記はXサーバーの例。
ここに正しいフルパスを設定しないと500エラーが出る。少なくとも私は出た。サーバーのコンソール画面で設定できるなら、そっちの方が無難だ。
なお、手動でパスワードファイルを作成するときは、まずローカルで以下のコマンドを実行する(htpasswd
コマンドは、Apacheをインストールしていれば使えるはずである)。
ファイル名は何でもよいが、.htpasswd
とするのが一般的らしい。
このコマンドを打つと、パスワードを入力を求められる。2回打つとユーザー名と暗号化されたパスワードを含むファイルが出力されるので、それをAuthUserFile
に指定したパスにアップロードする。
参考資料:AuthType
配置する場所
.htaccess
は、設定を適用したいディレクトリに置く。この設定はディレクトリ単位で適用される。ディレクトリ単位というのは、そのディレクトリのサブディレクトリも含む。
サブディレクトリに異なる設定を適用したいケースでは、そのディレクトリ用の.htaccess
を用意する。
.htaccess
を書くときは、常にその上のディレクトリに.htaccess
がある(つまり上書きして変なことになる可能性がある)ことを念頭に置いておくべきである。