ウェブサイトの引っ越し、暗号通信(SSL化)の導入、特定ページのURLを変更、ディレクトリ名の変更。このような時によく使われる「.htaccessでのリダイレクト設定」。

ここでは、転送(リダイレクト)を行う際の.htaccessの基本的なお約束事と、用途ごとの実際のサンプルを紹介。

転送(リダイレクト)を設定する際のお約束

1.「mod_rewrite」を条件付きとする

.htaccesでリダイレクト設定を行う際の大前提として、ほぼほぼ以下のような記述を見かけるはず。最初の行と最後の行に書かれているのがお約束事。

<IfModule mod_rewrite.c>
ここに設定を記述
</IfModule>

このお約束事を書くことで「もし、サーバーにmod_rewriteというモジュールがインストールされていたら、既述された設定の通りにリライトをおこなってね」という、mod_rewriteがあった場合にのみ設定が有効になる条件付きでの設定となる。

mod_rewriteが何かというと、ApacheというWebサーバーでURLの書き換え行うためのモジュールのこと。これを使ってリダイレクトを実現する。

一般的なレンタルサーバーならほぼ確実にサーバーにインストールされているが、自分でサーバーを構築してたり、カスタマイズしている環境などでは、mod_rewriteがないこともある。そういった場合にエラーが出ないように、条件付きの設定をするわけ。

2.「mod_rewrite」を使う宣言を行う

無事に、mod_rewriteがサーバーにインストールされていた場合、さっそくそれを使うための宣言をおこなう。そのためのお約束事が以下の記述。

RewriteEngine On

リダイレクトの設定を行うときは、この宣言のあとに、リダイレクトが発動するための条件と、どういうルールでリダイレクトをさせるかを設定してあげる必要がある。

3.リダイレクトが発動するための条件とルールを設定する

発動する条件は「RewriteCond」で設定する。その条件に合致した際に「RewriteRule」で設定されたルールが発動する。

RewriteCond 条件1
RewriteRule ルール1
RewriteRule ルール2

もしも、条件が複数ある場合は列記し、複数ある中のいずれかである場合は「[OR]」を使う。

# 条件1と条件2に当てはまる場合
RewriteCond 条件1
RewriteCond 条件2

# 条件1または条件2が当てはまる場合
RewriteCond 条件1 [OR]
RewriteCond 条件2

その他のコードの意味

[R]強制的にリダイレクトさせる。R=301なら301リダイレクトで「Permanent Redirect=恒久的な転送(引っ越し等)」、Rだけなら302リダイレクトで「Temporary Redirect=一時的な転送(メンテナンス等)」 を表す。
[L]書き換えが行われたら終了 (Last) にする。これ以降に記述されたルールで書き換えられないようにする。
[F]強制的にアクセスを禁止し、HTTP レスポンスの「403 : Forbidden」を返すようにする。
[NC]「 No Case 」の略で、文字の大小を区別しないようにする。 "A-Z" と "a-z" を区別しない。

では、これを踏まえて以降にそれぞれの一般的な環境下での転送(リダイレクト)設定方法を紹介。

よく使うリダイレクトの設定いろいろ

wwwあり/なしを統一したい

# wwwありに統一する場合
RewriteEngine on
RewriteCond %{HTTP_HOST} ^example\.com$
RewriteRule ^(.*)$ https://www.example.com/$1 [R=301,L]

# wwwなしに統一する場合
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www\.example\.com$
RewriteRule ^(.*)$ https://example.com/$1 [R=301,L]

旧ドメインから新ドメインへリダイレクトする方法

古いドメイン「old.com」にアクセスがあったら、新しいドメイン「new.com」へ転送するルールを設定する方法。

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP_HOST} ^old.com
RewriteRule ^(.*) https://new.com/$1 [R=301,L]
</IfModule>

ディレクトリ名をリダイレクトする方法

古いディレクトリ「/old/」にアクセスがあったら、新しいディレクトリ「/new/」へ転送するルールを設定する方法。

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule ^old(.*)$ /new$1 [R=301,L]
</IfModule>

ページファイル名をリダイレクトする方法

古いページ「old.html」へアクセスがあったら、新しいディレクトリ「new .html」へ転送するルールを設定する方法。

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule ^old.html$ /new.html [R=301,L]
</IfModule>

SSL導入によるhttp→httpsへリダイレクトする方法

基本コード

httpでアクセスされた場合の転送(リダイレクト)設定は、以下コードが基本となり、以降で紹介するコードを追記していく流れ。

<IfModule mod_rewrite.c>
RewriteEngine On
# HTTPでアクセスされた場合の設定
RewriteCond %{HTTPS} off

~ 設定をここに追記 ~
</IfModule>

1.全てのアクセスをhttpsにリダイレクトする

# https にリダイレクト
RewriteRule ^.*$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

2.特定のページやディレクトリだけhttpsに リダイレクトする

# 以下の特定URLをリダイレクトする
RewriteCond %{HTTP_HOST} www.example.com
RewriteCond %{REQUEST_URI} ^/admin/.*$ [OR]
RewriteCond %{REQUEST_URI} ^/content/.*$ 

3.ただし、以下のディレクトリやファイル形式はリダイレクトから除外する

# リダイレクトから除外するディレクト、ファイル形式
RewriteCond %{REQUEST_URI} !^/assets/.*$
RewriteCond %{REQUEST_URI} !^.*\.(js|css|gif|jpg|png|ico|svg)$

スマートフォンからのアクセスは「/sp/」を付けてリダイレクトする

PCからのアクセスはそのままURL(例: https://example.com)で、スマートフォンからのアクセスは「/sp/」を付ける(例:https://example.com/sp/)にする方法。

RewriteEngine On
RewriteBase /

# スマホのアクセスは「/sp/」を付ける
RewriteCond %{REQUEST_URI} !/sp/
RewriteCond %{HTTP_USER_AGENT} !(iPod|iPhone|Android.*Mobile|Windows.\ Phone) [NC]
RewriteRule ^(.*)$ sp/$1 [R=301,L]
 
# スマホでなければ「/sp/」を取る
RewriteCond %{REQUEST_URI} /sp/
RewriteCond %{HTTP_USER_AGENT} !!(iPod|iPhone|Android.*Mobile|Windows.\ Phone) [NC]
RewriteRule ^sp/(.*)$ $1 [R=301,L]

# おまけ:ガラケーだったら「/mb/」を付ける
RewriteCond %{REQUEST_URI} !/mb/
RewriteCond %{HTTP_USER_AGENT} (DoCoMo|J-PHONE|Vodafone|SoftBank|UP.Browser) [NC]
RewriteRule ^(.*)$ /mb/$1 [R=301,L]

# おまけ:ガラケーでなければ「/mb/」を取る
RewriteCond %{REQUEST_URI} /mb/
RewriteCond %{HTTP_USER_AGENT} !(DoCoMo|J-PHONE|Vodafone|SoftBank|UP.Browser) [NC]
RewriteRule ^mb/(.*)$ $1 [R=301,L]