.htaccessは、Apache HTTP サーバーで使われる設定ファイルである(Nginxとは関係ない)。ディレクトリ単位の設定を主な対象とする。

.htaccessとは

.htaccessとは、Apache HTTP サーバーに対する設定を記述したテキストファイルである。頭の"."は、Un隠しファイルであることを示す。"ht"はHypertextの略だ。

このファイルをディレクトリに配置すると、そのディレクトリ及びそれ以下のディレクトリに設定が適用される。もし配下のディレクトリにも.htaccessが存在する場合は、そちらが優先される。

もしメインの設定ファイル(httpd.confapache2.confなど)にアクセスできるのであれば、.htaccessではなくそちらを使った方が良い。というか使うべきだ。.htaccessを使うと遅くなる。

と、ドキュメントに書いてある。

ただ、レンタルサーバーの利用者には難しい(ほとんど無理な)注文だ。

できること

.htaccessを使うと、例えば以下のようなことができる。

できること 概要
リダイレクト ページAへのアクセスをページBに自動で振り替える。
リライトルールの適用 サーバー上のファイルパスと表示するURLの対応を変更する。
パスワード保護 ユーザー名とパスワードによってアクセスを制限する(=Basic認証)。
アクセス制限 特定のIPや、Webページからのアクセスを制限する。
キャッシュコントロール 高速化のための各種ファイルデータの保存期間とかを設定する。
圧縮の有効化 コンテンツを圧縮する。

SSL化は数時間から数時間経たないと。 ドメインを取得した直後はまだドメインが「浸透」していない。

基本的な書き方

Apache HTTP サーバーの設定ファイルでは、1行に1つのディレクティブ(命令文的なやつ)を書く。

ディレクティブに引数を渡したいときは、半角スペースで区切る。引数がスペースを含むときは、その引数を"で囲む。なお、ディレクティブは大文字小文字でもよいが、引数は環境による。

また、#で始まる行はコメントとして理解される。

望む設定を行うには、それぞれのディレクティブとその引数を理解しておく必要がある。

例えば、以下はWordPressでデフォルトで用意されている.htaccessである。

apacheconf
# BEGIN WordPress
# "BEGIN WordPress" から "END WordPress" までのディレクティブ (行) は
# 動的に生成され、WordPress フィルターによってのみ修正が可能です。
# これらのマーカー間にあるディレクティブへのいかなる変更も上書きされてしまいます。
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress

コメントの部分(先頭に#のある行)はよいとして、<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つずつ覚えていかねばならない。めっちゃたいへん。コピペでしのぎたい。というかコピペでしのぎながら少しずつ覚えていけばよいと思う。

ちなみにディレクティブの一覧はここ変数とか演算子の一覧はここにある。

リダイレクトの例

apacheconf
<Location "/one">
    Redirect permanent "http://example.com/two"
</Location>
<Location "/three">
    Redirect 303 "http://example.com/other"
</Location>
<LocationMatch "/error/(?<NUMBER>[0-9]+)">
    Redirect permanent "http://example.com/errors/%{env:MATCH_NUMBER}.html"
</LocationMatch>

引用元:Redirect

アクセス制限の例

apacheconf
Require all denied
Allow from example.org

参考元:Require

Basic認証の例

apacheconf
AuthUserFile "/home/xs000000/sample.com/htpasswd/.htpasswd"
AuthName "Member Site"
AuthType BASIC
require valid-user

AuthUserFileに指定するパスは、アクセスされない場所ならどこでもよい。ただ、おそらくサーバー上に"htpasswd"的なディレクトリが用意されているはずなので、その中でよいと思う。ちなみに上記はXサーバーの例。

ここに正しいフルパスを設定しないと500エラーが出る。少なくとも私は出た。サーバーのコンソール画面で設定できるなら、そっちの方が無難だ。

なお、手動でパスワードファイルを作成するときは、まずローカルで以下のコマンドを実行する(htpasswdコマンドは、Apacheをインストールしていれば使えるはずである)。

bash
htpasswd -c 任意のファイル名 任意のユーザーID

ファイル名は何でもよいが、.htpasswdとするのが一般的らしい。

このコマンドを打つと、パスワードを入力を求められる。2回打つとユーザー名と暗号化されたパスワードを含むファイルが出力されるので、それをAuthUserFileに指定したパスにアップロードする。

参考資料:AuthType

配置する場所

.htaccessは、設定を適用したいディレクトリに置く。この設定はディレクトリ単位で適用される。ディレクトリ単位というのは、そのディレクトリのサブディレクトリも含む。

サブディレクトリに異なる設定を適用したいケースでは、そのディレクトリ用の.htaccessを用意する。

.htaccessを書くときは、常にその上のディレクトリに.htaccessがある(つまり上書きして変なことになる可能性がある)ことを念頭に置いておくべきである。

参考資料