【.htaccess】mod_rewrite モジュール – その1 リダイレクトの基本

mod_rewrite モジュールは、「URL の書き換え」を行うためのモジュールです。
mod_rewrite モジュールの機能を利用することで、Redirect ディレクティブと同じく、リダイレクトを行えます。mod_rewrite モジュールのリダイレクトでは、より細かな設定を行えます。

mod_rewrite モジュールを利用したリダイレクトの基本構文

mod_rewrite モジュールでリダイレクトを行うには、基本的には、RewriteEngine、RewriteBase、RewriteRule の3つのディレクティブを利用します。

RewriteEngine On
RewriteBase /
RewriteRule 転送元ファイル 転送先URL [R=301,L]

一つずつ見ていきましょう。

  • 1行目: RewriteEngine
  • mod_rewrite モジュールを有効化します。デフォルトでは “Off” になっているので、”On” にすることで利用を宣言します。

  • 2行目: RewriteBase
  • 転送先の URL の基準となるディレクトリを指定するのですが、

    ① 3行目の RewriteRule で指定する転送先の URL が相対パスの場合 ⇒ 転送元(.htaccess の置かれているディレクトリ)からみて、転送先の URL の基準となるディレクトリまでの相対パスを指定
    (省略した場合、RewriteRule ディレクティブの基準となる URL は .htaccess が置かれたディレクトリ、つまり ” RewriteBase / ” となります。)

    ② 3行目の RewriteRule で指定する転送先の URL が絶対パスの場合 ⇒ 不要

  • 3行目: RewriteRule
  • URL 書き換えのルールを指定します。

    転送元ファイル: .htaccess の置かれたディレクトリ内のファイル名となります。正規表現が使えます。

    転送先URL : 絶対パス、相対パス共に指定できますが、相対パスで指定する場合、2行目のRewriteBase で指定したディレクトリが基準となります。後方参照が利用できます。

    [R=301,L] : [ ] の中は、フラグ(RewriteRule ディレクティブの機能)を指定します。URL 書き換えに関する様々なフラグ(⇒ RewriteRule のフラグ一覧)がありますが、今回はリダイレクトを行うので、リダイレクトを指定するフラグ、” R (=リスポンスコード) ” と記述します。
    ” R=301 ” ⇒ 恒久的な移動の場合指定(”R= permanet ” と記述も可能)
    ” R=302 ” ⇒ 一時的な移動の場合指定(” R=temp ” と記述も可能)
    コードを指定しない場合、デフォルトの ” R=302 ” となります。

    複数のフラグを指定する場合は、” , ” で区切ります。” R=301 ” に続いて、URL の書き換えの終了を指示するフラグ、” L ” を記述し、後述のルールを実行させないようにします。

mod_rewrite モジュールを利用したリダイレクトの設定例

“blue.com” と、”green.com” という二つのドメインがあったとします。

以降、4つのパターンを考えてみます。

① 別サイトへ1ページのみの転送
blue.com/index.html ⇒ green.com/index.html

② サイト全体転送
blue.com ⇒ green.com (それぞれ対応するファイルへ転送)

③ サイト内一部のディレクトリを転送
blue.com/circle ⇒ green.com/square (それぞれ対応するファイルへ転送)

④ 同じサイト内で1ページ転送
blue.com/example01.html ⇒ blue.com/example02.html

すべて恒久的な移動とするので、RewriteRule のフラグは、[R=301,L] とします。

<① 別サイトへ1ページのみ転送>

RewriteEngine On
RewriteRule index\.html  http://green.com/index.html [R=301,L]

1行目: “RewriteEngine On” => mod_rewrite モジュールを利用の有効化

2行目: “RewriteRule” => 書き換えルールを指定
” index\.html ” => .htaccess ファイルの置かれた blue.com 内の index.html が転送元であるという意味
” http://green.com/index.html ” => 転送先 URL

* 転送先 URL が絶対パスで記述されているので、RewriteBase は省略
* RewriteRule ディレクティブは正規表現に対応するので、メタ文字を普通の文字として扱うには、直前に” \ “が必要です。” index.html ” は、” index\.html ” と記述。

<② サイト全体転送>

RewriteEngine On
RewriteRule (.*)$  http://green.com/$1 [R=301,L]

1行目: “RewriteEngine On” => mod_rewrite モジュールを利用の有効化

2行目: “RewriteRule” => 書き換えルールを指定
” (.*)$ ” => ” (.*) ” は0回以上の文字の繰り返し、” $ “は文字列の文末がマッチ(.htaccess ファイルの置かれた blue.com 内の それぞれのファイルが転送元であるという意味)
” http://green.com/$1 “=> 、” $1 ” = ” (.*) ” (green.com 内のそれぞれ対応する転送先 URLを意味)

* 転送先 URL が絶対パスで記述されているので、RewriteBase は省略

<③ サイト内一部のディレクトリを転送>

RewriteEngine On
RewriteRule ^circle/(.*)$  http://green.com/square/$1 [R=301,L]

1行目: “RewriteEngine On” => mod_rewrite モジュールを利用の有効化

2行目: “RewriteRule” => 書き換えルールを指定
” ^circle/(.*)$ ” => ” ^ ” は文字列先頭が一致、 ” (.*) ” は0回以上の文字の繰り返し、” $ “は文字列の文末がマッチ(.htaccess ファイルの置かれた blue.com 内、circle ディレクトリ内のそれぞれのファイルが転送元であるという意味)
” http://green.com/square/$1 “=> 、” $1 ” = ” (.*) ” (green.com 内、square ディレクトリ内のそれぞれ対応する転送先 URLを意味)

* 転送先 URL が絶対パスで記述されているので、RewriteBase は省略

<④ 同じサイト内で1ページ転送>

RewriteEngine On
RewriteBase /
RewriteRule example01\.html  example02.html [R=301,L]

1行目: “RewriteEngine On” => mod_rewrite モジュールを利用の有効化

2行目: “RewriteBase /” => 転送先の基準となる ディレクトリを指定。転送元(.htaccessの置かれたディレクトリ)と同じディレクトリ内という意味。

3行目:”RewriteRule” => 書き換えルールを指定
” example01\.html ” => .htaccess ファイルの置かれた blue.com 内の example01.html が転送元であるという意味
” example02.html ” => 2行目のRewriteBase で指定された基準となる伝送先ディレクトリ内 (blue.com) の example02.html が転送先 URL

ファイルの最終行には空行を入れる必要があります。ご注意ください!