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

  
  
  
  
コメント