【.htaccess】mod_rewrite モジュール – その3 様々なリダイレクト利用例

mod_rewrite モジュールについて、これまでまとめたページはこちら
その1 mod_rewrite を利用したリダイレクトの基本
その2 RewiteCond ディレクティブ

mod_rewrite モジュールを利用することで、リダイレクトの様々な設定ができます。
以降の例は全て、「hazu.jp」というドメインへのアクセスがあった場合の例として記述します。

www ありなし設定

wwwあり URL を、wwwなし URL にリダイレクト、またその逆の処理を行います。
(例)「http://www.hazu.jp」⇔「http://hazu.jp」

<www なしに統一>

RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.hazu\.jp [NC]
RewriteRule ^(.*)$ http://hazu.jp/$1 [R=301,L]

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

2行目: “RewriteCond” => 書き換えの条件定義
環境変数 “HTTP_HOST” はリクエスト先のホスト名を返します。RewriteCond では、”%{HTTP_HOST}” という形で情報を読み込み、テスト文字列として扱います。
“^www\.hazu\.jp” は条件パターンです。正規表現が使われています。”^” は先頭にそれに続く文字列がある場合にマッチ。”.” がメタ文字であるため、それを普通の文字として扱うために、直前に “\” を記述しエスケープさせます。

要するに、「 “%{HTTP_HOST}” で得たホスト名 = “www.hazu.jp/~” 」かどうか、という条件を定義しています。

オプションの [NC] は、大文字小文字の区別をしないという指示をしています。

3行目:”RewriteRule” => 書き換えルールを指定
” ^(.*)$ ” => .htaccess ファイルの置かれたディレクトリの各ファイルが転送元であるという意味。
“^” は先頭にそれに続く文字列がある場合にマッチ、”(.*)” は0回以上の文字の繰り返し、” $ “は文字列の文末がマッチ。
” http://hazu.jp/$1 “=>同じファイル名で、www なしに書き換えを指示しています。
” $1 ” = ” (.*) ” を意味している後方参照です。
[R=301,L] => 301リダイレクト(恒久的な転送)後、終了。

このような流れです。

RewriteRule 条件 “^(.*)$” でファイル名取得

RewriteCond テスト文字列 “%{HTTP_HOST}” で、RewriteRule で得たファイル “^(.*)$” のホスト名を取得

RewriteCond 条件パターン “%{HTTP_HOST}” = “www.hazu.jp/~” であるかどうか検証

RewriteRule 置換文字列 RewriteCond での検証が true なら、”http://hazu.jp/~” に転送

<www ありに統一>
逆パターンです。

RewriteEngine On
RewriteCond %{HTTP_HOST} ^hazu\.jp [NC]
RewriteRule ^(.*)$ http://www.hazu.jp/$1 [R=301,L]

index.html ありなし設定

/index.html へアクセスがあった場合、/(ディレクトリ)へリダイレクトさせます。

RewriteEngine On
RewriteCond %{THE_REQUEST} ^.*/index\.html
RewriteRule ^(.*)/index\.html$ http://hazu.jp/$1 [R=301,L]

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

2行目: “RewriteCond” => 書き換えの条件定義
環境変数 “THE_REQUEST” は、ユーザのブラウザから送られる HTTP リクエスト行の情報です。”GET /index.html HTTP/1.1″ などというような内容なので、そこからどのファイルへのアクセスなのかということが分かります。
%{THE_REQUEST} でリクエスト行の情報を得て、次の条件パターン “^.*/index\.html” で、そこに”/index.html”という文字列が含まれるか検証します。

要するに、「 ユーザは “/index.html” の文字列の含まれるファイルにアクセス 」しようとしているかどうか、という条件を定義しています。

3行目:”RewriteRule” => 書き換えルールを指定
“^(.*)/index\.html$” ⇒ .htaccess ファイルの置かれたディレクトリの index.html ファイルが転送元という意味。
“^” は先頭にそれに続く文字列がある場合にマッチ、”(.*)” は0回以上の文字の繰り返し、” $ “は文字列の文末がマッチ。
” http://hazu.jp/$1 “=> 転送先はディレクトリ。
” $1 ” = ” (.*) ” を意味している後方参照です。
[R=301,L] => 301リダイレクト(恒久的な転送)後、終了。

https(SSL)へリダイレクト

http(非SSL)の URL へのアクセスを、https(SSL)の URL へリダイレクトさせます。
(当然ですが、前提として、サーバで SSL 利用可能となっている場合です。)

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://hazu.jp/$1 [R=301,L]

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

2行目: “RewriteCond” => 書き換えの条件定義
環境変数 HTTPS は、https 通信なら on、http 通信なら off を返します。

なので、「“%{HTTPS}” = “off” 」かどうか、を検証しています。

3行目:”RewriteRule” => 書き換えルールを指定
” ^(.*)$ ” => .htaccess ファイルの置かれたディレクトリの各ファイルが転送元であるという意味。
“^” は先頭にそれに続く文字列がある場合にマッチ、”(.*)” は0回以上の文字の繰り返し、” $ “は文字列の文末がマッチ。
” https://hazu.jp/$1 “=> 同じファイル名で、https に書き換えを指示しています。
” $1 ” = ” (.*) ” を意味している後方参照です。
[R=301,L] => 301リダイレクト(恒久的な転送)後、終了。

特定のファイルやディレクトリを除外してリダイレクトさせたり、類似のファイル名をまとめたり、拡張子がないリクエストも表示させたり、時間や曜日によって表示させるページを振り分けたりなど、環境変数をうまく使って、様々な細かな設定ができます。

.htaccess では、コマンドの最後に空行を入れる必要があります。お忘れなく。