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

コメント