[htaccess] .htaccessの書き方

今までサンプルをコピペして何となく使ってきましたが、
一度ちゃんと理解しようと思い.htaccessファイルの書き方をまとめてみました。

基本

.htaccessファイルは前提として以下のルールに従って作らなくてはなりません。

  • ファイル名は「.htaccess」
     (httpd.confファイルを編集すれば別のファイル名にすることは可)
  • ファイルの文字コードは「UTF-8(BOMなし)」
  • ファイルのパーミッションは基本的に644(rw-r--r--)
  • 最終行には空行を1行つくる
  • .htaccessファイルを配置したディレクトリ配下がすべて影響を受ける
  • 異なる階層にそれぞれ.htaccessファイルを配置した場合は、両方のhtaccessファイルの影響を受ける。その場合は、より下層に配置された.htaccessの設定が優先されます。

以下が.htaccessファイルを書く時のベースです。

.htaccessは最終的に以下のような感じになります。

コメントの書き方

行の先頭を#で始めるとその行はコメントになります。

行の途中からコメントにしたい場合は"で括ります。

行の途中からのコメントはApache2.0以降でのみ使用できます。

<IfModule mod_rewrite.c>タグ

「IfModule mod_rewrite.c」タグは書かなくても問題ない場合が多いですが、
書いておくと安全です。

このタグで括ると、使用している環境でmod_rewriteが使えるか判定して、使える場合のみ中に記述されたコードが実行されるようになります。

RewriteEngine

RewriteEngineを有効/無効にする設定です。通常有効にするので、以下の1文はお決まりで記述します。

(構文)
RewriteEngine [On|Off]

RewriteBase

Rewrite処理後のベースのURLを指定する設定です。

(構文)
RewriteBase <パス>

省略した場合は.htaccessファイルが置かれた場所が指定されたとみなされます。

RewriteCond

RewriteRule を実行するための条件を指定します。

(構文)
RewriteCond <値1> <値2>

値2は文字列や正規表現で指定してもいいし、以下に示した記号を指定してもOKです。

意味としては、「<値1>が<値2>に合致した場合は、直後に出現するRewriteRuleを実行するよ」といった感じです。

まとめると以下のようになります。

  • Rewrite処理のルールを指定する
  • RewriteCondを複数行指定して複数のルールを指定することが可能
  • RewriteRuleの直前に指定する

RewriteCondでは以下の変数と記号が使用できます。

(変数)

環境変数意味
%{HTTP_HOST}ドメイン
%{REMOTE_ADDR}アクセス元のIPアドレス
%{REQUEST_URI}リクエストされたファイルパス
※先頭にはスラッシュが入る
%{REQUEST_FILENAME}リクエストされたファイル名
%{HTTPS}プロトコルがhttpsならon、httpならoff
%{HTTP_USER_AGENT}アクセス元の端末情報
%{HTTP_REFERER}直前のページURL

(記号)

記号意味
-d指定したディレクトリが存在するかどうか
-f指定したファイルが存在するかどうか
-s指定したファイルが存在し、サイズがゼロでないかどうか
-x指定したファイルが存在し、実行権限があるかどうか

記号の先頭に「!」を付けると意味が反転します。

RewriteRule

Rewrite処理のURL書き換えルールを指定します。

(構文)
RewriteRule <書き換え前のパターン> <書き換え後のパターン> <フラグ>

意味としては、「リクエストされたURLが<書き換え前のパターン>に合致した場合は、<書き換え後のパターン>に変換してリダイレクトするよ。リダイレクトの条件は<フラグ>ね。」といった感じです。

直前にあるRewriteCondの判定がすべてTRUEでない場合は、そもそもRewriteRuleは実行されません。


フラグでリダイレクトの方法を指定できます。

(フラグ一覧)

フラグ意味
R=301恒久的なリダイレクト(301リダイレクト)
R=302一時的なリダイレクト(302リダイレクト)
RR=302と同じ
LRewriteRuleにマッチした場合次行以降の処理は行わない
NC大文字小文字を区別しない

カンマ区切りで複数のフラグを指定可。例)[R=301,L]

Rを指定した場合は、Lの記述は必須。

まとめ

  • ざっくりとした解説でした。
    .htaccessはもっと奥が深いので興味がある方は掘り下げてみて下さい。

コメント

タイトルとURLをコピーしました