[htaccess] .htaccessの書き方

2019年12月7日

今までサンプルをコピペして何となく使ってきましたが、一度ちゃんと理解しようと思い .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はもっと奥が深いので興味がある方は掘り下げて調べてみて下さい。

スポンサーリンク