.htaccess
を利用したリダイレクト設定の書き方について解説しています。.htaccess
ファイルの書き方については、以下の記事をご参考ください。
リダイレクトとは
Webサイト(あるいはコンテンツページ)を訪れた際、一瞬画面が白くなったあと、あるいは「◯秒後に新しいサイトへ転送します」というメッセージが表示され、画面が切り替わって表示されたという経験があるかと思います。別のページへ転送される理由はサイトの移転やコンテンツの移動など理由はさまざまですが、このようなWebサイト(ページ)のURLを変更した際に自動的に別のURLへ転送される仕組みを「リダイレクト」といいます。
サイトの移転やサイト内コンテンツの移動などのほか、サイトが悪意のある第三者によって改竄され、フィッシングサイトへ転送されるのも、改竄されたサイトによるリダイレクトによって行われています。
.htaccessによるリダイレクト設定の書き方
.htaccess
によるリダイレクト設定は、Webサーバー(Apache)にmod_rewrite
というモジュールがインストールされている必要があります。このモジュールはリダイレクト設定やURLの書き換えに必要なもので、WordPressを利用するのにも必須のモジュールです。一般的なレンタルサーバーには標準でインストールされているので、とくに何かをする必要はありません。
<IfModule mod_rewrite.c></IfModule>
の囲みの中でリダイレクト設定を記述しますが、囲まなくても動作するサーバーがほとんどです。囲んでおくとわかりやすいかと思います。
以下、基本的なリダイレクト設定の記述です。
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond [リダイレクト(あるいはURL書き換え)条件を定義]
RewriteRule [元のURL] [リダイレクト(あるいはURL書き換え)後のURL] [R=301,L]
</IfModule>
RewriteEngine On
でmod_rewrite
モジュールの利用を宣言します。<IfModule mod_rewrite.c></IfModule>
で囲わずにリダイレクトを複数設定する場合、RewriteEngine On
は最初の1回のみの記述します。
RewriteCond
でリダイレクト(あるいはURLの書き換え)条件を定義し、この条件を満たす場合にRewriteRule
で定義されているルールを実行して処理します。
条件の定義が必要ないリダイレクトでは、RewriteCond
そのものを記述しません。RewriteRule
は必須です。
RewriteCond
やRewriteRule
には正規表現と呼ばれる記述が使用でき、以降の例でも使用しています。正規表現についての説明は本題から逸れるため本記事では説明を省きますが、^(.*)$
のように構成されている部分が正規表現に該当します。
また、リダイレクトのステータスコード([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証明書を導入している場合であっても、設定しておくことをおすすめします。
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に転送します。
# 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
の%1
はRewriteCond
でマッチした値を参照しています。
RewriteCond
末尾の[NC]
フラグは「条件の評価時に大文字小文字を区別しない」という意味です。
まったく別のURLに転送する
サイト(ページ)にアクセスされた際、まったく別のURLに転送します。
下記の例では、サイト内のすべてのページへのアクセスに対して、https://example.jp/
に転送しています。
RewriteEngine on
RewriteRule ^(.*)$ https://example.jp/ [R=301,L]
下記の例では、/example
ディレクトリ配下のすべてのページへのアクセスに対して、https://example.jp/
に転送しています。
RewriteEngine on
RewriteRule ^example(.*)$ https://example.jp/ [R=301,L]
下記の例では、サイトのドメイン直下のaa.html
へのアクセスに対して、https://example.jp/bb.html
に転送しています。
RewriteEngine on
RewriteRule ^aa.html$ https://example.jp/bb.html [R=301,L]
同じサイト内で転送する
同じサイト内でページやディレクトリを変更した際のリダイレクト設定例です。
下記の例では、サイトのドメイン直下のaa.html
へのアクセスに対して、同じサイト内のbb.html
に転送しています。
RewriteEngine on
RewriteRule ^aa.html$ /bb.html [R=301,L]
下記の例では、/before
ディレクトリ配下のすべてのページへのアクセスに対して、同じサイト内の/after
ディレクトリの同ファイルに転送しています。
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>
内に記述します。
<meta http-equiv="refresh" content="[秒数]; URL=[リンク先のURL]">
[秒数]
には半角数字で指定します。0
を指定するとアクセスと同時に転送しますが、meta
タグでの指定時にはあまりおすすめしません。[リンク先のURL]
に転送先のURLを指定します。/(スラッシュ)
からはじめることで、同じサイト内でのリダイレクトが可能です。
<!-- 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
を利用できる環境であれば、そちらを利用する方が便利かと思います。
本記事の解説は以上です。