今までサンプルをコピペして何となく使ってきましたが、
一度ちゃんと理解しようと思い.htaccessファイルの書き方をまとめてみました。
基本
.htaccessファイルは前提として以下のルールに従って作らなくてはなりません。
- ファイル名は「.htaccess」
(httpd.confファイルを編集すれば別のファイル名にすることは可) - ファイルの文字コードは「UTF-8(BOMなし)」
- ファイルのパーミッションは基本的に644(rw-r--r--)
- 最終行には空行を1行つくる
- .htaccessファイルを配置したディレクトリ配下がすべて影響を受ける
- 異なる階層にそれぞれ.htaccessファイルを配置した場合は、両方のhtaccessファイルの影響を受ける。その場合は、より下層に配置された.htaccessの設定が優先されます。
以下が.htaccessファイルを書く時のベースです。
1 2 3 4 |
<IfModule mod_rewrite.c> RewriteEngine On #ここにリダイレクトの設定を書く </IfModule> |
.htaccessは最終的に以下のような感じになります。
1 2 3 4 5 6 7 8 |
#サンプル <IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule .* /index.php [R=301,L] </IfModule> |
コメントの書き方
行の先頭を#で始めるとその行はコメントになります。
1 |
#コメントです |
行の途中からコメントにしたい場合は"で括ります。
1 |
RewriteEngine On "#コメントです" |
行の途中からのコメントはApache2.0以降でのみ使用できます。
<IfModule mod_rewrite.c>タグ
「IfModule mod_rewrite.c」タグは書かなくても問題ない場合が多いですが、
書いておくと安全です。
1 2 3 |
<IfModule mod_rewrite.c> ~ </IfModule> |
このタグで括ると、使用している環境でmod_rewriteが使えるか判定して、使える場合のみ中に記述されたコードが実行されるようになります。
RewriteEngine
RewriteEngineを有効/無効にする設定です。通常有効にするので、以下の1文はお決まりで記述します。
1 |
RewriteEngine On |
- (構文)
- RewriteEngine [On|Off]
RewriteBase
Rewrite処理後のベースのURLを指定する設定です。
1 |
RewriteBase / |
- (構文)
- RewriteBase <パス>
省略した場合は.htaccessファイルが置かれた場所が指定されたとみなされます。
RewriteCond
RewriteRule を実行するための条件を指定します。
1 2 |
RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d |
- (構文)
- 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書き換えルールを指定します。
1 |
RewriteRule .* /index.php [R=301,L] |
- (構文)
- RewriteRule <書き換え前のパターン> <書き換え後のパターン> <フラグ>
意味としては、「リクエストされたURLが<書き換え前のパターン>に合致した場合は、<書き換え後のパターン>に変換してリダイレクトするよ。リダイレクトの条件は<フラグ>ね。」といった感じです。
直前にあるRewriteCondの判定がすべてTRUEでない場合は、そもそもRewriteRuleは実行されません。
フラグでリダイレクトの方法を指定できます。
(フラグ一覧)
フラグ | 意味 |
---|---|
R=301 | 恒久的なリダイレクト(301リダイレクト) |
R=302 | 一時的なリダイレクト(302リダイレクト) |
R | R=302と同じ |
L | RewriteRuleにマッチした場合次行以降の処理は行わない |
NC | 大文字小文字を区別しない |
カンマ区切りで複数のフラグを指定可。例)[R=301,L]
Rを指定した場合は、Lの記述は必須。
まとめ
- ざっくりとした解説でした。
.htaccessはもっと奥が深いので興味がある方は掘り下げてみて下さい。
コメント