低価格・高品質・最速のHTMLコーディングはクロノドライブへ

新人コーダーに知っておいて欲しいリダイレクトの基本

サイトを運営していると、サイト内のページの移動や削除、またはサイト自体の移転をすることがあります。その場合、リダイレクトという処理を用いて新たなページに転送を行いますが、正しい知識と手順を以って対応しなければ、検索順位の下降、ページランクやドメインエイジの喪失といったSEO的なペナルティを招いてしまいます。

そこで、そのようなペナルティを受けないために、ページ移動・サイト移転時の正しいリダイレクトの設定方法と、代表的なリダイレクトの種類やその実装方法をご紹介します。

リダイレクトの種類

リダイレクトには、HTMLやJavaScriptといったクライアントサイドプログラム、PHPやPerlといったサーバサイドプログラム、あるいは.htaccessの設定変更を行う等、様々な対応方法があります。そのうちのいくつかを、実際のサンプルソースとともに解説します。

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

head要素内に記述されたmetaタグによりリダイレクトを行う方法です。記述としては、以下のようになります。

1<meta http-equiv="refresh" content="秒数;URL=URL">

指定の例

5秒後に相対パスで指定したURLにリダイレクトさせる場合
相対パスの指定は、同じドメイン内の別ページにリダイレクトする場合に使用します。例えば、「/sample/index.html」というページから、「/redirect/index.html」というページにリダイレクトさせる場合、「/sample/index.html」の<head>タグ内に、
1<meta http-equiv="refresh" content="5;URL=../redirect/index.html">
というタグを記入します。
10秒後に絶対パスで指定したURLにリダイレクトさせる場合
絶対パスの指定は、別ドメインのサイトやページにリダイレクトさせる場合に使用します。例えば、「http://www.example01.com/」から「http://example02.com/」へリダイレクトさせる場合、「http://www.example01.com/」内の各ページの<head>タグ内に、
1<meta http-equiv="refresh" content="10;URL=http://www.example02.com/">
というタグを記入します。

この方法を利用するメリットとして、

  • HTMLのみで設定できる
  • 転送までの秒数が指定できる

という点が挙げられます。サイト内で転送設定を行う場合であれば、特別な準備は必要ないため、手軽に使うことができます。

ただし、サイト移転の場合に使うと、一部の検索エンジンで「前のドメインが持っていた情報が、新しいドメインに引き継がれない」という可能性があります。
例えば、Yahoo!ではmetaタグによる0秒指定のリダイレクトが後述の301リダイレクトとして扱われるため、前のドメインが持っていた情報が引き継がれますが、Googleでは.htaccessやPHPなどによる301リダイレクトを推奨していること、metaタグでのリダイレクトではスパム判定を受けることがあることから、前のドメインの情報が正しく引き継がれない可能性があります。

前のドメインの情報が引き継がれないということは、検索エンジンにしてみれば「これはまったく別のサイトである」という認識になります。 検索エンジンは、

  • どのぐらい価値のあるコンテンツを提供しているのか
  • どのぐらい他のサイトからリンクを張られているか=被リンクがあるのか
  • どのぐらい長く運営されているのか

といった情報をそれぞれのサイトに対して持っており、その情報を元に表示される検索順位を決定しています。つまり、「まったく別のサイトである」ということは、それらの情報がリセットされてしまうということであり、検索順位のアドバンテージも失われてしまいます。それにより、「移転前は検索上位に表示されていたのに、移転後に急に順位が落ちてしまった」ということが起こりかねません。

また、この方法では検索エンジンに対して「サイトが移転した」という状況が伝わらないため、「内容が同じサイトが2つある」と判断され、ミラーサイトとしてペナルティを受けてしまう可能性もあります。

ミラーサイトとは、あるサイトの内容をそっくりそのまま、あるいは一部分をそのままコピーしたサイトのことを言います。同一の内容が複数のサイトやページに含まれている場合、それらの内容から検索した検索結果の質が下がってしまうため、これらは検索エンジンにとって「複製サイトである・重複コンテンツである」とみなされ、検索順位を下げられたり、最悪の場合は検索対象から外されてしまうことがあります。

そのため、metaタグによるリダイレクトは、あくまでサイト内での利用に留めておいたほうがSEO上はよいということになります。サイトの移転を行う際は、後述の「301リダイレクト」を利用するといいでしょう。

301リダイレクト

HTTPヘッダのステータスコードによりリダイレクトの種類を伝え、その上でリダイレクトを行う方法の一つで、「301」のステータスコードはMoved Permanently(恒久的な移動)を意味し、完全にサイトやページが移動した、ということを表します。

301リダイレクトを利用するメリットとして、前述のmetaタグによるリダイレクトと異なり、「サイトが移転した」という情報が正しく検索エンジンに伝わるため、移転前のサイトの情報が移転後のサイトに受け継がれる、という点です。
つまり、新規サイトやミラーサイトではない、れっきとした移転サイトであるということを示すことで、それまで積み重ねた検索エンジンからの評価をゼロにすることなくサイトの移転を行うことができるのです。

301リダイレクトの設定方法は、.htaccess、PHP、Perl、JSPやASPなど多岐にわたりますが、今回はその中でも比較的利用しやすい「.htaccess」と「PHP」の設定についてご紹介します。

サイト全体を.htaccessで301リダイレクトさせる場合

サイト内のすべてのページに対して、指定したURLへリダイレクトさせる場合は下記を指定します。

1<IfModule mod_rewrite.c> 
2RewriteEngine On 
3RewriteCond %{http_host} ^現在のURL 
4RewriteRule ^(.*)$ 移転後のURL$1 [R=301,L] 
5</IfModule>

例)http://www.example01.com/からhttp://www.example02.com/にリダイレクトさせる場合

1<IfModule mod_rewrite.c> 
2RewriteEngine On 
3RewriteCond %{http_host} ^www.example01.com 
4RewriteRule ^(.*)$ http://www.example02.com/$1 [R=301,L] 
5</IfModule>

現在のURLの記述と、移転後のURLの記述が異なるので注意してください。
(現在のものはhttp://~を除いた記述、移転後のものはフルパスで記述)

特定ページのみ.htaccessで301リダイレクトさせる場合

特定のページに対してのみ、リダイレクト設定を行う場合は下記を指定します。

1<IfModule mod_rewrite.c> 
2RewriteEngine On 
3RewriteRule ^対象ページのURL$ 移転後のURL [R=301,L] 
4</IfModule>

例).htaccessと同一のフォルダにあるsample.htmlをhttp://www.example.com/にリダイレクトさせる場合

1<IfModule mod_rewrite.c> 
2RewriteEngine On 
3RewriteRule ^sample\.html$ http://www.example.com/ [R=301,L] 
4</IfModule>

htaccessでリダイレクトを行うメリットとして、
・1つのファイルで多数のファイルやフォルダを制御できる
という点が挙げられます。つまり、サイトを丸ごと移転する場合などに手間が少なくて済むのです。
ただし、利用するためにはWebサーバがApacheで構成されている、mod_rewriteモジュールがサポートされている必要があるといった前提条件があります。

なお、mod_rewriteモジュールがサポートされていない場合は、以下を.htaccessに記載することで、301リダイレクトを使用することができます。

例)http://www.example01.com/からhttp://www.example02.com/にリダイレクトさせる場合

1<IfModule mod_rewrite.c> 
2RedirectMatch 301 .* http://www.example02.com/ 
3</IfModule>

ただし、こちらの方式ではクエリ、すなわちURLに付与される文字列までは対応できないため、例えば
http://www.example01.com/?status=1
というURLからリダイレクトしようとすると、クエリもそのまま引き継いで
http://www.example02.com/?status=1
というように、リダイレクト先が意図したURLとならない可能性があります。

前述のmod_rewriteモジュールを使用したバージョンでは、クエリをすべて破棄してリダイレクトします。ですので、可能であればmod_rewirteを使用したバージョンを使用すべきです。

PHPで301リダイレクトさせる場合

1<?php 
2    header('Location: http://www.example.com/', true, 301);  
3    exit(); 
4?>

上記をPHPファイルの文頭に記述します。

PHPでリダイレクトを行うメリットとして、
・使用するための条件が緩い
という点が挙げられます。PHPを利用できる環境であれば.htaccessのようにサーバプログラムの種類を問わないため、.htaccessの利用が制限されているレンタルサーバ等ではこちらを利用すると良いでしょう。ただし、上記の処理をファイルに直接記述する必要があるため、リダイレクトさせたいすべてのファイルに同じ記述をする必要があります。

それぞれの注意点として、この設定を導入するためにはWebサーバ側での設定(具体的には、Apacheサーバのmod_rewriteモジュールの設定)や、PHPを利用できる環境を整えるなど、いくつかの事前準備が必要です。最近ではそのどれかを利用できる環境がほとんどですが、古いWebサーバではそれらが一切使えない場合があるため、留意が必要です。

302リダイレクト

302リダイレクトは、301リダイレクトと同様、検索エンジンに「サイトが移転した」という情報を伝えます。ただし、こちらは「一時的な移動」という意味を表すため、移転前のサイトの情報が移転後のサイトに受け継がれることはありません。

metaタグによるリダイレクトと異なる点は、ステータスコードにより「一時的な移転である」という情報が伝わっているため、移転後のサイトがミラーサイト扱いとなり、SEO上のペナルティを受ける可能性が低いことです。また、301リダイレクトを利用した場合、「恒久的な移転」であるため、移転前のサイトは検索エンジンからインデックスされなくなりますが、302リダイレクトの場合は、元のサイトがインデックスされ続けます。

利用する場合は、あくまで「一時的な移動」として、例えばメンテナンス中である、サーバエラーが発生しているといった要因により一時的にサイト移動をしなければならない、といった状況でのみ使うとよいでしょう。目安としては、数日~数週間程度の場合には302リダイレクトを使い、それ以上リダイレクトを続ける必要がある場合は301リダイレクトを使うべきです。
302リダイレクトの設定方法は、301リダイレクトと同様に「.htaccess」と「PHP」のものをご紹介します。

サイト全体を.htaccessで302リダイレクトさせる場合

1<IfModule mod_rewrite.c> 
2RewriteEngine On 
3RewriteCond %{http_host} ^現在のURL 
4RewriteRule ^(.*)$ 移転後のURL$1 [R=302,L] 
5</IfModule>

例)http://www.example01.com/からhttp://www.example02.com/にリダイレクトさせる場合

1<IfModule mod_rewrite.c> 
2RewriteEngine On 
3RewriteCond %{http_host} ^www.example01.com 
4RewriteRule ^(.*)$ http://www.example02.com/$1 [R=302,L] 
5</IfModule>

現在のURLの記述と、移転後のURLの記述が異なるので注意してください。
(現在のものはhttp://~を除いた記述、移転後のものはフルパスで記述)

特定ページのみ.htaccessで302リダイレクトさせる場合

1<IfModule mod_rewrite.c> 
2RewriteEngine On 
3RewriteRule ^対象ページのURL$ 移転後のURL [R=302,L] 
4</IfModule>

例).htaccessと同一のフォルダにあるsample.htmlをhttp://www.example.com/にリダイレクトさせる場合

1<IfModule mod_rewrite.c> 
2RewriteEngine On 
3RewriteRule ^sample\.html$ http://www.example.com/ [R=302,L] 
4</IfModule>

PHPで302リダイレクトさせる場合

1<?php 
2    header('Location: http://www.example.com/, true, 302); 
3    exit(); 
4?> 

その他のリダイレクトの種類

これまで紹介した301や302以外にも、リダイレクトの種類はいくつか存在します。それらを簡単にご紹介します。

303リダイレクト

See Other(他を参照せよ)を意味し、リダイレクト先のURLに対し、GETメソッドでアクセスすることが決められています。例えば、フォームページでPOSTした後にリダイレクトでTOPページヘ戻したい場合、TOPページに対して同じデータをPOSTしても意味がないため、303リダイレクトでGETに変更する、といった用途で使われます。

.htaccessを使用した場合(.htaccessと同一のフォルダにあるhoge.htmlをhttp://www.example.com/にリダイレクトさせる場合)

1<IfModule mod_rewrite.c>
2RewriteEngine On 
3RewriteRule hoge\.html$ http://www.example.com/ [R=303,L] 
4</IfModule>

PHPを使用した場合

1<?php 
2    header('Location: http://www.example.com/, true, 303); 
3    exit(); 
4?>

307リダイレクト

Temporary Redirect(一時的なリダイレクト)を意味し、内容としては302リダイレクトとほぼ同一です。ただし、307では「リクエストに使用した動詞(GETメソッドやPOSTメソッド)をそのまま使う」という違いがあります。そのため、リダイレクト元でGETやPOSTの指定があり、それをそのままリダイレクト先へ引き継がせたい場合は、307リダイレクトを使います。

.htaccessを使用した場合(.htaccessと同一のフォルダにあるhoge.htmlをhttp://www.example.com/にリダイレクトさせる場合)

1<IfModule mod_rewrite.c>
2RewriteEngine On 
3RewriteRule hoge\.html$ http://www.example.com/ [R=307,L] 
4</IfModule>

PHPを使用した場合

1<?php 
2    header('Location: http://www.example.com/, true, 307); 
3    exit(); 
4?>

また、304 Not Modified(未更新)および305 Use Proxy(プロキシを使用せよ)は一般的にページやサイトのリダイレクトには利用されません。306は現状未使用のステータスコードです。

総括

いかがでしたでしょうか。一口にリダイレクトと言っても、表す意味がそれぞれ異なっていることがお分かりいただけたかと思います。使い方次第で、スムーズにサイト移転を行うこともできますし、逆にSEO上のペナルティを受けることもあります。サイト移転をお考えの場合は、参考にしていただければ幸いです。

また、HTTPのステータスコードは他にも多くの種類があります。次回以降は、そちらをご紹介させていただきます。

「フロントエンドエンジニアの教科書」を出版しました!HTML・CSS・JavaScript+α 次世代コーダーのための仕事術

HTMLコーダーからフロントエンドエンジニアにステップするために必要な知識と技術を解説。
現場で求められる人材となるためには、何を知っていて、何ができなければいけないのか。
Web制作の最先端にいるクロノドライブだからこそ教えられるノウハウが満載です。

出版社名:ソフトバンククリエイティブ
著者:クロノドライブ

Amazon.co.jp詳細ページへ