Skip to content

.htaccessを利用したリダイレクト設定の書き方について

.htaccessを利用したリダイレクト設定の書き方について解説しています。
.htaccessファイルの書き方については、以下の記事をご参考ください。

リダイレクトとは

Webサイト(あるいはコンテンツページ)を訪れた際、一瞬画面が白くなったあと、あるいは「◯秒後に新しいサイトへ転送します」というメッセージが表示され、画面が切り替わって表示されたという経験があるかと思います。別のページへ転送される理由はサイトの移転やコンテンツの移動など理由はさまざまですが、このようなWebサイト(ページ)のURLを変更した際に自動的に別のURLへ転送される仕組みを「リダイレクト」といいます。

サイトの移転やサイト内コンテンツの移動などのほか、サイトが悪意のある第三者によって改竄され、フィッシングサイトへ転送されるのも、改竄されたサイトによるリダイレクトによって行われています。

.htaccessによるリダイレクト設定の書き方

.htaccessによるリダイレクト設定は、Webサーバー(Apache)にmod_rewriteというモジュールがインストールされている必要があります。このモジュールはリダイレクト設定やURLの書き換えに必要なもので、WordPressを利用するのにも必須のモジュールです。一般的なレンタルサーバーには標準でインストールされているので、とくに何かをする必要はありません。

<IfModule mod_rewrite.c></IfModule>の囲みの中でリダイレクト設定を記述しますが、囲まなくても動作するサーバーがほとんどです。囲んでおくとわかりやすいかと思います。

以下、基本的なリダイレクト設定の記述です。

apache
<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteCond [リダイレクト(あるいはURL書き換え)条件を定義]
  RewriteRule [元のURL] [リダイレクト(あるいはURL書き換え)後のURL] [R=301,L]
</IfModule>

RewriteEngine Onmod_rewriteモジュールの利用を宣言します。
<IfModule mod_rewrite.c></IfModule>で囲わずにリダイレクトを複数設定する場合、RewriteEngine Onは最初の1回のみの記述します。

RewriteCondでリダイレクト(あるいはURLの書き換え)条件を定義し、この条件を満たす場合にRewriteRuleで定義されているルールを実行して処理します。
条件の定義が必要ないリダイレクトでは、RewriteCondそのものを記述しません。RewriteRuleは必須です。

RewriteCondRewriteRuleには正規表現と呼ばれる記述が使用でき、以降の例でも使用しています。正規表現についての説明は本題から逸れるため本記事では説明を省きますが、^(.*)$のように構成されている部分が正規表現に該当します。

また、リダイレクトのステータスコード([R=301,L]の数字部分)にはいくつか種類がありますが、通常のリダイレクト設定でよく利用するのは以下の2つです。

  • 301:恒久的なリダイレクト(サイトやコンテンツ移転など、リダイレクト後のURLが変わらないもの)
  • 302:一時的なリダイレクト(サイトがメンテナンス中で、一時的にメンテナンス画面に飛ばしている場合など)

[R][L]はフラグと呼ばれるもので、[R]は「指定したURLにリダイレクト」、[L]は「書き換え処理を終了して以降のルールを無視(スキップ)する」という意味です。フラグは他にも種類がありますが、リダイレクト設定で主に使用するのはこの2つです。
基本的にRewriteRuleの末尾には[R=301,L]を指定します。

.htaccessによるリダイレクト設定例

.htaccessで設定できるリダイレクトについて、用途別に解説しています。

SSLリダイレクト

http://でアクセスした際にhttps://からはじまるURLに転送します。

サーバーにSSL証明書を設置した状態ではhttp://でもhttps://でもどちらでもアクセスできるため、サイトを運用している途中でSSL証明書を導入した場合のほか、新規に立ち上げるサイトで最初からSSL証明書を導入している場合であっても、設定しておくことをおすすめします。

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

RewriteCondで定義している条件は「httpsでのアクセスではない場合」です。この条件を満たす場合に、RewriteRuleで定義されている「アクセスしたURL」を「https://からはじまるURL」に変換して転送しています。

%{HTTP_HOST}はホスト名を表す変数、%{REQUEST_URI}はホスト名より後ろの部分(文字列)を表す変数です。

wwwあり・なしのURLに転送する

URLが「wwwあり」「wwwなし」どちらでもアクセスできる場合は、どちらかに統一しておく方がよいです。
以下はそれぞれ「wwwあり」「wwwなし」かつhttps://のURLに転送します。

apache
# httpsかつwwwありにリダイレクト
RewriteEngine on
RewriteCond %{HTTP_HOST} !^www\.(.*)$ [NC]
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

# httpsかつwwwなしにリダイレクト
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ https://%1%{REQUEST_URI} [R=301,L]

wwwあり」に転送する場合の条件は「ホスト名がwwwがはじまっていない場合」です。この条件を満たす場合に、「アクセスしたURL」を「https://www.をつけたURL」に変換して転送します。

wwwなし」に転送する場合の条件は「ホスト名がwwwがはじまっている場合」です。この条件を満たす場合に、「アクセスしたURL」を「https://かつwwwを抜いたURL」に変換して転送します。
RewriteRule%1RewriteCondでマッチした値を参照しています。

RewriteCond末尾の[NC]フラグは「条件の評価時に大文字小文字を区別しない」という意味です。

まったく別のURLに転送する

サイト(ページ)にアクセスされた際、まったく別のURLに転送します。

下記の例では、サイト内のすべてのページへのアクセスに対して、https://example.jp/に転送しています。

apache
RewriteEngine on
RewriteRule ^(.*)$ https://example.jp/ [R=301,L]

下記の例では、/exampleディレクトリ配下のすべてのページへのアクセスに対して、https://example.jp/に転送しています。

apache
RewriteEngine on
RewriteRule ^example(.*)$ https://example.jp/ [R=301,L]

下記の例では、サイトのドメイン直下のaa.htmlへのアクセスに対して、https://example.jp/bb.htmlに転送しています。

apache
RewriteEngine on
RewriteRule ^aa.html$ https://example.jp/bb.html [R=301,L]

同じサイト内で転送する

同じサイト内でページやディレクトリを変更した際のリダイレクト設定例です。

下記の例では、サイトのドメイン直下のaa.htmlへのアクセスに対して、同じサイト内のbb.htmlに転送しています。

apache
RewriteEngine on
RewriteRule ^aa.html$ /bb.html [R=301,L]

下記の例では、/beforeディレクトリ配下のすべてのページへのアクセスに対して、同じサイト内の/afterディレクトリの同ファイルに転送しています。

apache
RewriteEngine on
RewriteRule ^before(.*)$ /after$1 [L,R=301]

/before/page.htmlにアクセスすると、ファイル名はそのままで/after/page.htmlに転送されます。
$1は後方参照といって、正規表現でマッチした値(文字列)を参照しています。例の場合、(.*)の部分が正規表現で検索している箇所(/page.htmlに該当)で、/after$1の箇所で同じ値を代入しています。

.htaccessによるリダイレクト設定時の留意事項

.htaccessファイルを編集する際はかならずバックアップを取ってから作業をするようにしてください。
.htaccessファイルに記述された内容はサーバーのもともとの設定を追加・変更します。書き方を間違えるとサーバーエラーを引き起こすため、以下の点に注意して作業してください。

  • かならず事前にバックアップ(コピー)をする
  • ファイルの文字コードはUTF-8で作業する
  • コメントアウトの記述以外で全角文字を使用しない(とくに全角スペースは気づかないことが多いです)

また、リダイレクト設定はRewriteCondの条件定義を間違えると多重リダイレクトが発生してしまう可能性があるため、サーバーの.htaccessファイルを更新したあとはかならず動作確認を行なってください。

metaタグによるリダイレクト設定

リダイレクト設定はmetaタグでも可能です。
.htaccessファイルで行うリダイレクト設定はアクセスと同時に転送されますが、metaタグの場合は転送までの秒数を指定できるので、「新サイトへの移転を知らせつつ、自動的に転送する」ということが可能です。

metaタグでリダイレクト設定する場合は、以下をリダイレクトさせたいページの<head></head>内に記述します。

html
<meta http-equiv="refresh" content="[秒数]; URL=[リンク先のURL]">

[秒数]には半角数字で指定します。0を指定するとアクセスと同時に転送しますが、metaタグでの指定時にはあまりおすすめしません。
[リンク先のURL]に転送先のURLを指定します。/(スラッシュ)からはじめることで、同じサイト内でのリダイレクトが可能です。

html
<!-- 5秒後にhttps://example.jp/に転送する -->
<meta http-equiv="refresh" content="5; URL=https://example.jp/">

<!-- 5秒後にサイト内の/exampleに転送する -->
<meta http-equiv="refresh" content="5; URL=/example">

metaタグによるリダイレクト設定は対象ページに記述する必要があるため、設定するページが多いと大変です。また、古いページもリダイレクトのためしばらくはサーバーに残しておく必要があるため、.htaccessを利用できる環境であれば、そちらを利用する方が便利かと思います。


本記事の解説は以上です。