制作の久保田です。

今回は、.htaccess のリダイレクト設定の方法を見ていきます。
コピペで使えるコードと、少し踏み込んだ記述内容の意味を掲載していますので、興味のある方は詳細まで目を通してみてください。

リダイレクトとは?

webサイトの転送設定のことをリダイレクトといいます。
古いページに訪れたら、新しいページに転送をかけたい場合に設定します。

以下のようなケースでリダイレクト設定を行います。

  • サイトのリニューアル
  • ページのリニューアル
  • 期間限定のページ
  • サイトメンテナンス
  • サイトのページ削除(トップページに転送など)

サイトのリニューアル等でページのurlが変わった場合、古いアドレスへアクセスした際、「ページが存在しない(NOT FOUND)」状態になるのを防ぐため、リダイレクトの設定が必要になります。

Googleにインデックスされている場合は、転送設定をかけることで、インデックスの評価(PageRank)も引き継ぐことができます。
Googleの評価を引き継ぐのは、検索順位にとって非常に重要で、eccoでサイトをリニューアルをした場合は、必ず旧サイトからのリダイレクト設定を行っています。

.htaccessとは?

.htaccess(ドット エイチ ティー アクセス)とは、webサーバー(Apache)の設定ファイルの事で、サイトにリダイレクトをかける他、ページをパスワード保護したり、アクセス制限したりする場合に設定します。

ファイル自体は、テキストエディットやメモ帳などで書くことができるテキストファイルです。
.htaccess という名前でサーバーにアップロードして使用します。
※macの場合、ドット(.)で始まるファイルは不可視ファイルになるため、ローカルで名前を変更する場合は注意してください。

.htaccessの有効範囲

.htaccess はアップロードされた、配下のディレクトリすべてにたいして有効になります。
ecco.jp サイト全体に有効化したい場合は、 以下のように ecco.jp のルートディレクトリに配置します。
以下の .htaccess で、ecco.jp から new.ecco.jp に転送設定をかけた場合、https://www.ecco.jp/service/website/ にアクセスした場合も転送設定が有効になります。

サイト全体ではなく、特定のディレクトリに有効化しい場合は、そのディレクトリ配下に配置します。
以下の場合は、https://www.ecco.jp/company/ や https://www.ecco.jp/contact/ にアクセスした場合、.haccessの設定は有効ではありません。

301リダイレクト

リダイレクトの方法には、「301リダイレクト」と「302リダイレクト」の2種類があります。
単なる数字なのでわかりずらいですが、「ずっと!」か「今だけ!」の違いです。

サーバーに、この転送設定はこれから先「ずっと」有効ですと伝えるのは「301」リダイレクト。
そうではなく一時的に転送したい場合、この転送は「今だけ」有効ですと伝えるのは「302」リダイレクトです。

この設定の違いは、Googleの検索順位にも影響します。
301でリダイレクトをかけた場合、Googleは、転送後のサイトを評価するようになります。
逆に302でのリダイレクトの場合は、転送前のサイトを評価し続けます。

サイトのリニューアル等、今後古いサイトに戻す必要がない場合は「301」リダイレクトを設定し、一時的なメンテナンス表示をする場合等は「302」リダイレクトを設定するようにします。

.htaccess設定時の注意点

.htaccess は単純なテキストファイルなので、更新自体は簡単です。
ただ、設定を間違えるとサーバーエラーになり、サイト全体が落ちるといった事にもなります。

.htaccess の設定ミスでのエラーは「500エラー」と呼ばれ、原因の特定が難しいエラーです。
リダイレクト設定での無限ループであったり、phpのバージョン設定であったり、存在しないファイルの参照であったりします。
.htaccess ファイルを更新するときは、必ずバックアップをとって、すぐに戻せる状態にしておきましょう。

以下で記述するコードも、あくまで自己責任で設定し、少しでも不安がある場合はweb制作会社に依頼いただくことをおすすめします。

ケース別、リダイレクト方法

.htaccess ファイルは、サイトによってはすでに存在する場合があります。
その場合、大抵は既存の記述に追記するかたちで大丈夫です。
もしうまく動作しない場合は、もともとの記述内容を理解する必要があるため、制作会社に依頼することをおすすめします。

※ここに記載した内容は、動作を保証するものではありません。あくまで自己責任で使用してください。

ページをリダイレクト

単体のページをリダイレクトする場合の記述は以下になります。

RewriteEngine on
RewriteRule ^ファイル名$ 転送後のフルパス [L,R=301]

変更するのは色のついた箇所です。
転送をかけたいファイル名と転送後のフルパスを記述します。

ecco.jp/before.htmlをecco.jp/after.htmlに飛ばしたいときの記述は以下のようになります。

# ページをリダイレクト
RewriteEngine on
RewriteRule ^before.html$ https://ecco.jp/after.html [L,R=301]

コードの詳細

ファイル名の前についている(^)は先頭位置、後ろについてる($)は末尾の位置の指定です。
上の例の場合、(先頭)before.html(末尾)を指定しているのでbefore-before.htmlやbefore.htmには一致せず、転送されません。
最後についている [L,R=301] は301リダイレクトの設定です。一時的なリダイレクトの場合は、302を設定します。

ディレクトリをリダイレクト

ディレクトリにリダイレクトをかけたい場合は以下のように記述します。

RewriteEngine on
RewriteRule ^ディレクトリ名(.*)$ /転送先ディレクトリ名$1 [L,R=301]

色のついた箇所に、元のディレクトリ名と、転送先のディレクトリ名を記述します。

/before/をすべて/aftere/に転送する場合は、以下のようになります。

# ディレクトリをリダイレクト
RewriteEngine on
RewriteRule ^before(.*)$ /after$1 [L,R=301]

コードの詳細

詳しく見ていくと、ディレクトリ名の後ろにある (.*) は 0文字以上の任意の文字列を表しています。
ドットは何かの文字、アスタリスクは直前のドットの0回以上の繰り返しという意味があります。
(.*) の部分でマッチした文字列は、転送先ディレクトリの方で参照する必要があります。
$1 の部分は、後方参照と言い、先の括弧でマッチした文字列を参照しています。

上記の転送の場合は
/before/index.htmlでアクセスした場合、/index.html 部分が (.*) でマッチし
$1で参照され、/afterの後ろに連結したurl として、/after/index.htmlに転送されます。

上記のような記述は、正規表現と呼ばれます。
詳細を知りたい方は、「正規表現」で検索して調べてみてください。

http://からhttps://にリダイレクト(SSL化)

常時SSL化があたりまえとなり、httpでのアクセスは、「保護されていない通信」として警告が表示されるようになったためSSL化されたサイトでは、http://からhttps://へのリダイレクトも必要になりました。
リダイレクトの設定は、以下のように記述します。

# http:// から https:// にリダイレクト
RewriteEngine on
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

コードの詳細

^(.*)$の部分は、先に記載したとおり先頭から末尾までの、0文字以上の文字列です。
この場合、すべての文字列にマッチするので、全アクセスが対象です。

%{HTTP_HOST} はドメイン部分
%{REQUEST_URI} はリクエストされたurlのドメイン以降になります。
なので、この場合すべてのリクエストをhttps://に変更してそのままリクエストします。

wwwを有り無しを統一

www の有り無しは Googleサーチコンソールでも設定できますが、htaccess で設定する場合は以下のように記述します。

無しに統一

wwwを無しに統一するには、以下のように記述します。

# wwwを無しに統一
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^(.*)$ https://%1/$1 [R=301,L]
コードの詳細

RewriteCondの行は、www.の記述があるかを判定しています。

^www\.(.+)$ [NC]

ドットは任意の文字を意味しているので、ドット自体を指定する場合は、前にバックスラッシュを付けて(\.)とします。
[NC] は大小文字を問わないという意味です。
上記は、日本語にすると以下みたいな感じになります。

(先頭)www.(任意の文字列)(末尾)[大小文字問わず]

www.のついたすべてのリクエストを対象にしています。

実際にリダイレクトを行っているのは、RewriteRuleの行です。

https://%1/$1

RewriteCondでマッチした値は %1で参照できます。先に出てきた$1と似たような意味合いです。
上記でwww無しのurlへリダイレクトされます。
SSL化されてないサイトの場合は、https://の部分は、http://としてください。

有りに統一

wwwを有りに統一するには、以下のように記述します。

# wwwを有りに統一
RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\.(.+)$ [NC]
RewriteCond %{HTTP_HOST} (.+)$ [NC]
RewriteRule ^(.*)$ https://www.%1/$1 [R=301,L]
コードの詳細

記述の方法は、無しにする場合と似ていますが、こちらは(!)でwww.が入ってなかった場合に実行する記述になってます。

!^www\.(.+)$ [NC]

(!)で続く内容の否定の場合です。www.が無かったらの意味になります。
続くリダイレクトの箇所は、無しに統一の部分とほぼ同じで www. が付いたurlへ飛ばしています。

https://www.%1/$1 [R=301,L]

まとめ

今回は、よくあるリダイレクト設定の記述方法のご紹介をしました。
コードは短い記述なのですが、先に書いたように、.htaccessの編集は非常にリスクが高いです。
必ず.htaccessのバックアップをとってから作業し、サーバーエラーになってもすぐに復旧できる状態で作業するようにしてください。

思ったように動作しない場合は、ファイルの先頭に記述すると動作する場合があります。
それでも動作がうまく行かない場合は、制作会社に依頼するようにしましょう。

以上、.htaccessのリダイレクト設定方法でした。