mod_rewrite モジュールは、「URL の書き換え」を行うためのモジュールです。
mod_rewrite モジュールの機能を利用することで、Redirect ディレクティブと同じく、リダイレクトを行えます。mod_rewrite モジュールのリダイレクトでは、より細かな設定を行えますが、書き換え前の URL に置かれたファイル、書き換え後の URL に置かれたファイル、両方がないと機能しません。
mod_rewrite モジュールについて5回でまとめます。
その1 リダイレクトの基本 ← 今回
その2 RewriteCond ディレクティブ
その3 様々なリダイレクト利用例
その4 HTTP 環境変数一覧
その5 RewriteRule のフラグ一覧
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
ファイルの最終行には空行を入れる必要があります。ご注意ください!