書き方いろいろ「301リダイレクト」「302リダイレクト」など

ホームページ制作会社だけでなく、自分でホームページを作っている人でもリダイレクト処理を行ったことがある人は多いかと思います。

  • ドメインを変更した
  • コンテンツ(ディレクトリ)の階層が変わってしまった
  • ページのURLが変わってしまった
  • ページを削除した など

こんなときは、リダイレクト処理が必要です。
書き方がいくつかあるので見てみましょう

この記事は「2020年12月16日」に書かれた記事です

  1. 301リダイレクトと302リダイレクトの違い
  2. 301リダイレクトの書き方
  3. 302リダイレクトの書き方
  4. 404 リダイレクト
  5. メンテナンス時は「503」
  6. htaccess でもリダイレクト処理ができない場合

1.301リダイレクトと302リダイレクトの違い

主なリダイレクト処理に「301」と「302」があります。どちらもリダイレクトされますが、意味が異なります。

301リダイレクト「301 Permanent Redirect(恒久的な転送)」

  • 元のページから完全に転送するための設定
  • 設定することで今までの評価が継続される

302リダイレクト「302 Temporary Redirect (一時的な転送)」

  • 元のページから一時的に転送する設定
  • 原則的に数日~2週間程度の短期間のリダイレクトに利用する
  • 設定することで今までの評価を維持する
リダイレクトの処理を行ってからを検索エンジンが転送されたことを認識するまでの時間は、「301リダイレクト」の方が早いといわれています。

2.301リダイレクトの書き方

ドメイン単位でリダイレクトをかける

リダイレクト1「Redirect permanent」を利用する

例)このホームページを新しく取得したドメイン「d-matsue-new.net」へ転送する(※実際にこのドメインは取得していません。)

Redirect permanent / https://d-matsue-new.net/
  • d-matsue-new.net 部分は設定するホームページのドメインに変更してください。
  • デメリットとしては正規表現やフラグが使えないことや、無限ループが発生しやすいことが挙げられます。
リダイレクト2「RewriteRule」を利用する

例)このホームページを新しく取得したドメイン「d-matsue-new.net」へ転送する(※実際にこのドメインは取得していません。)

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{http_host} ^d-matsue.net
RewriteRule ^(.*) https://d-matsue-new.net /$1 [R=301,L]
</IfModule>
  • d-matsue.net、d-matsue-new.net 部分は設定するホームページのドメインに変更してください。
  • RewriteRuleやRewriteCondは、正規表現が利用できます。正規表現を利用すると絞り込んだ形のリダイレクト処理など、さまざまな処理が可能になります

この記事では割愛し、よく使うものだけご紹介します。

リダイレクト1「Redirect permanent」と
リダイレクト2「RewriteRule」」の違い

RewriteRuleを利用するためには、Webサーバー(Apache)に、モジュール(拡張機能)の1つ「mod_rewrite」が入っている必要があります。つまり、mod_rewriteが入っていないサーバーでは、RewriteRuleを使用することはできません

  • そのため「RewriteRule」をもし使えるならば、<IfModule mod_rewrite.c>~</IfModule>という条件分岐を書いています。※mod_rewriteが利用できないサーバーで、この条件分岐の記述を表記していない場合エラーが生じます。
  • 「RewriteEngine On」は「mod_rewrite」の機能を利用するということを宣言しています。

ディレクトリ単位のリダイレクト

リダイレクト1「Redirect permanent」を利用する

例)homepage というディレクトを homepege2 というディレクトリにすべて転送させる

Redirect permanent /homepage/ https://d-matsue.net/homepage2/
  • 「homepage」部分には転送前のディレクトリを
  • 「https://d-matsue.net/homepage2/」部分には転送後のディレクトリを絶対パスで入力します。
リダイレクト2「RewriteRule」を利用する

例)homepage というディレクトを homepege2 というディレクトリにすべて転送させる

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^homepage(.*)$ /homepage2$1 [R=301,L]
</IfModule>
  • 「homepage」部分には転送前のディレクトリを
  • 「homepage2」部分には転送後のディレクトリを入力します。
ちょこっとメモ

たとえば、aboutディレクトリ全体をinfoディレクトリに飛ばすだけではなく、一部aboutディレクトリの中にあるcompany.phpは別のURLに遷移させたい場合、ページ単位のリダイレクト処理の後に、ディレクトリの処理を書きます。

Redirect permanent ^/about/company.php https://d-matsue.net/info/access.php
Redirect permanent ^/about/ https://d-matsue.net/info/

※ディレクトリ→ページの記述してしまうとうまく動作しないので注意が必要です。

ページ単位のリダイレクト

リダイレクト1「Redirect permanent」を利用する

例)old.php というページを、new.php にリダイレクトする

Redirect permanent old.php https://d-matsue.net/new.php
  • old.php は遷移前のページを
  • https://d-matsue.net/new.php には遷移後のページのURLを絶対パスで入力します。
リダイレクト2「RewriteRule」を利用する
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^old.php$ http://d-matsue.net/new.php [R=301,L]
</IfModule>
  • old.php は遷移前のページを
  • https://d-matsue.net/new.php には遷移後のページのURLを絶対パスで入力します。
ちょこっとメモ

「^」がついていたり、ついていなかったり、下記の2つの記述を見たことがありませんか?

Redirect permanent old.php https://d-matsue.net/new.php
Redirect permanent ^old.php https://d-matsue.net/new.php

これ実はちょっとした落とし穴で、「^」が付いてないと同じ名前のページがあった場合、同一の処理がかかります。

例えば

  1. old.php
  2. /homepage/old.php

という2つのページがあった場合に

Redirect permanent old.php https://d-matsue.net/new.php 

と記述したとします。

1はリダイレクト処理をしたいが、
2はリダイレクトしたくないのにも関わらず、https://d-matsue.net/new.php にリダイレクトがかかってしまいます。

そんなばかな

と思いますが、そういうことがあります。
もし同一のページ名がある場合は「^」をつけておきましょう。

2.302リダイレクトの書き方

302リダイレクトの書き方は、[R=301,L]が、 [R=302,L]となるだけなので、ほぼ301リダイレクトと同じです。

ドメイン単位でリダイレクトをかける

例)このホームページを新しく取得したドメイン「d-matsue-new.net」へ一時的に転送する(※実際にこのドメインは取得していません。)

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{http_host} ^d-matsue.net
RewriteRule ^(.*) https://d-matsue-new.net /$1 [R=302,L]
</IfModule>
  • d-matsue.net、d-matsue-new.net 部分は設定するホームページのドメインに変更してください。
  • RewriteRuleやRewriteCondは、正規表現が利用できます。正規表現を利用すると絞り込んだ形のリダイレクト処理など、さまざまな処理が可能になります

ディレクトリ単位のリダイレクト

例)homepage というディレクトを homepege2 というディレクトリにすべて一時的に転送させる

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^homepage(.*)$ /homepage2$1 [R=302,L]
</IfModule>
  • 「homepage」部分には転送前のディレクトリを
  • 「homepage2」部分には転送後のディレクトリを入力します。

ページ単位のリダイレクト

例)old.php というページを、new.php に一時的に転送する

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^old.php$ http://d-matsue.net/new.php [R=302,L]
</IfModule>
  • old.php は遷移前のページを
  • https://d-matsue.net/new.php には遷移後のページのURLを絶対パスで入力します。

4.404 リダイレクト

エンドユーザーが(利用者)がアクセスしてきたページがもしなかった場合、「NOT FOUND」画面が出てしまいどこにも行けなくなってしまうということがあります。これはせっかく訪れてくれた人にとってもがっかりする画面です。そんなときに設定しておくのが「404リダイレクト」。

設定は簡単です。下記の記述を設定し、404.htmlまたは、404.phpを用意しておきます。

ErrorDocument 404 /404.html(htmlの場合)
ErrorDocument 404 /404.php (PHPの場合)

404.htmlまたは、404.phpにサイトマップや、グローバルな美などの共通部分が表示されていれば、万が一、ホームページに存在しないページにアクセスがあった場合も、ほかのページへ有することができます。

ErrorDocument 404 https://ドメイン/404.html
と絶対パスで表記した場合、302リダイレクトとして処理されてしまうため注意が必要です。
そもそも存在しなページなんて作らなければいいのに

と思うかもしれませんが、

  • 途中でページを削除してしまったという理由のほかにも
  • エンドユーザーが直にURLを打ち込んだ場合や、
  • リンク自体にミスがあった場合なども

「NOT FOUND」が出てしまいます。それを避けるためにも設定しておいた方がよいでしょう。

5.メンテナンス時は「503」

ホームページをリニューアルする場合や、何かの理由で一時的にホームページを閉鎖する場合は、ホームページを訪れた人だけでなく、検索エンジンに対してもメンテナンス中ということをお知らせする「503」を使用します。

基本形

ホームページのどのページにアクセスがあってもメンテナンス中の画面を表示する
#htmlの場合
ErrorDocument 503 /maintenance.html
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_URI} !=/maintenance.html
RewriteRule ^.*$ – [R=503,L]
</IfModule>

#PHPの場合
ErrorDocument 503 /maintenance.php
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_URI} !=/maintenance.php
RewriteRule ^.*$ – [R=503,L]
</IfModule>
  • maintenance.phpはメンテナンス中に表示するページです。
  • 「RewriteEngine On」の次の「RewriteCond %{REQUEST_URI} !=/maintenance.php」でメンテナスのページのみアクセスを許可しています。
html と php 部分は拡張子が変わるだけです。
このあとはphp で説明します。htmlを利用する場合は、拡張子部分を変更してください。
一部の人の閲覧を許可する
  • メンテナンス中だけど、チェックのためにそのページを閲覧できるようにしておきたい。
  • またはメンテナンス中も作業したいという場合、IPアドレスで許可します。※IPは固定IPを使用します。
ErrorDocument 503 /maintenance.php
<IfModule mod_rewrite.c> 
RewriteEngine On
RewriteCond %{REQUEST_URI} !=/maintenance.php
RewriteCond %{REMOTE_ADDR} !=000.000.00.00 #アクセスを許可したいIPアドレス
RewriteRule ^.*$ – [R=503,L]
</IfModule>
一部のディレクトリを許可する

メンテナンス中だけど、このコンテンツだけは見せておきたいとい場合など、ディレクトリを許可します。
例)campaign

ErrorDocument 503 /maintenance.php
<IfModule mod_rewrite.c> 
RewriteEngine On 
RewriteCond %{REQUEST_URI} !=/maintenance.php
RewriteCond %{REQUEST_URI} !=/campaign/ #アクセスを許可したいディレクトリ
RewriteRule ^.*$ – [R=503,L]
</IfModule>

6.htaccess を使ってリダイレクト処理できない場合

meta refresh(メタリフレッシュ)の利用

  • ホームページをリニューアルしてドメインが変わったが、 htaccess でのリダイレクトがかけられない場合
  • 新しく作ったページにリダイレクト処理をかけたいがhtaccess でのリダイレクトがかけられない場合

などのときに<head>内の記述に下記を追加します。

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

例えば、3秒で https://d-matsue-new.net/ に遷移させる場合

<meta http-equiv="refresh" content="5;URL=https://d-matsue-new.net/">

注意点
meta refresh(メタリフレッシュ)による転送はページの評価を引き継ぎません
どうしてもhtaccess でのリダイレクトがかけれないときの処理として利用するのが良いかと思います。

<head>タグに挿入できない場合、JavaScriptを使用した転送もありますが、こちらはほぼ使ったことがなく、使い方の説明が不十分になりそうなので割愛します。
松江ブログ(M2エムツー)

HOME > ホームページ制作 > 初心者のためのホームページ制作 > 書き方いろいろ「301リダイレクト」「302リダイレクト」など

ページトップへ