初心者コーダーのための
HTML/CSS JavaScript PHP WordPress
難しい言葉や概念より、実践重視の入門ブログ
Web基礎知識

【.htaccess】リダイレクト方法!httpsへ統一(正規化)やサイト移転など【まとめ】

リダイレクト .htaccessでリダイレクトをしよう!

サイト移転したから旧サイトから新サイトに飛ばしたい!
URLを正規化したい!

えふぃ

こんな時こそ出番ですリダイレクト!

リダイレクトとは、特定のページへアクセスすると、強制的に別ページへ転送する処理のことです。

この記事では、コピペでOKなリダイレクトの記述紹介から、記述の解説まで行います。

特にURLの正規化は、SEO的観点からもセキュリティ面でも絶対にやっておきたいです!

URLの正規化とは

URLの正規化とは、同じページに対して複数存在するURLを、1つにまとめる(指定した1ヶ所へ転送させる)ことです。

えふぃ

http://にアクセスできてしまったら、SSL化した意味がないですね!

どうやってリダイレクトするの?

リダイレクトの記述は、「.htaccess」というファイルに記述していきます。
基本的にはサンプルコードをコピペしてURLを書き換えるだけでOK

ですが.htaccessの扱いに注意が必要です。

えふぃ

.htaccessに慣れている方は次の見出しまで飛ばしてOK
慣れていない方は、くれぐれも読み飛ばさないようお願いします。

.htaccessは、契約したサーバーによって扱い方が異なったり、できる処理とできない処理があったり、いろいろと制約があります。

むやみに触ってしまうと、画面真っ白、顔面蒼白になることもあります。

この辺については数行で語れない大切なことなので、別の記事で紹介しています。

リダイレクトの基本的な記述

リダイレクトの基本的な記述は以下になります。

RewriteEngine on
RewriteBase /
RewriteCond A B
RewriteRule C D [R=301,L]

それでは、1行ずつ見ていきましょう。

RewriteEngine on
「リダイレクトをしますよ。」と宣言しています。このまま使います。

RewriteBase /
リダイレクトの基準となるURLのパスを指定しています。
基本的にはこのまま使います。
この行を省略すると、.htaccessを設置したディレクトリが基準になります。

RewriteCond A B
「もしAがBなら実行していください。」と条件を指定する部分。
AとBは後ほど適切なものに書き換えていきます。
特に条件がなければこの行は省いてもOK

RewriteRule C D [R=301,L]
「CからDへ転送してください。」と宣言しています。
CとDも後ほど適切なものに書き換えていきます。
[R=301,L]はおまじないのようなものだと思ってください。

つまり全体を日本語に訳すと

AがBであれば、CをDに転送します

となります。

それではいざ、それぞれのリダイレクトを見ていきましょう!

[R=301,L]について

[R=301]は301リダイレクトのことで、[L]はリダイレクト終了のサインです。この2つをあわせて[R=301,L]と書くお約束ごとです。

リダイレクト記述方法まとめ①

目的にあったリダイレクトの方法をコード付きで紹介していきます。

全てドメインはefilamola.comにしているので、そこは各自適切なドメインに変更してください!

https(SSL化)のURLに統一する

http://efilamola.com → https://efilamola.com

RewriteEngine on
RewriteBase /
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
えふぃ

RewriteCond A Bで、「AがBならば」という条件を指していましたね!

今回は%{HTTPS} offなので、「%{HTTPS}offならば」という条件です。

かんたんに言うと、SSL化されていない場合という意味になります。

えふぃ

RewriteRule C Dは、「CからDへ転送」つまりリダイレクトのことでした!

Cの^(.*)$正規表現というものです。
とりあえず^(.*)$は、転送前のウェブサイト全ページだと思ってください。

記事の最後のほうで、正規表現について少しだけ触れています。

Dも何やら難しいですね。

%{HTTP_HOST}は、転送前のドメインを指します。
%{REQUEST_URI}は、転送前のドメイン以降を指します。

少し分かりにくいと思うので図で見てみましょう!

転送前であるCの部分に「http://efilamola.com」の記述がないのは、RewriteBase /によって既に定められているためです!

逆に転送後であるDの部分は、httpsから記述が必要になります。

wwwありかなしで統一する

wwwなしで統一する

https://www.efilamola.com → https://efilamola.com

RewriteEngine on
RewriteBase /
RewriteCond %{HTTP_HOST} ^www\.efilamola\.com$
RewriteRule ^(.*)$ https://efilamola.com%{REQUEST_URI} [R=301,L]

正規表現において.(ドット)は「何かしらの文字」という特殊な意味を持っています。
そのため、「www.efilamola.com」の.を、通常のドットマークと認識してくれません。

.の前に\(バックスラッシュ)を置いて「\.」とすることで、通常のドットマークと認識してもらえるのです。

えふぃ

もし.co.jpの場合だと「www\.efilamola\.co\.jp」となります!

なお転送後のURLに\がないのは、転送先は正規表現を使っていないからです。

wwwありで統一する

https://efilamola.com → https://www.efilamola.com

RewriteEngine on
RewriteBase /
RewriteCond %{HTTP_HOST} ^efilamola\.com$
RewriteRule ^(.*)$ https://www.efilamola.com%{REQUEST_URI} [R=301,L]

index.htmlをなしにする

https://efilamola.com/index.html → https://efilamola.com/

RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_URI} ^.*/index\.html$
RewriteRule ^(.*)index.html$ https://efilamola.com/$1 [R=301,L]

別ドメインへリダイレクトする(サイト移転)

https://efilamola.com → https://新サイトのドメイン

RewriteEngine on
RewriteBase /
RewriteCond %{HTTP_HOST} ^efilamola\.com
RewriteRule ^(.*)$ https://新サイトのドメイン/$1 [R=301,L]

$1は、正規表現で使った()内の変数となります。

つまりここでは「$1 = .*」となっています。
.*については正規表現の項目で紹介しています。

リダイレクト記述方法まとめ②

特定のディレクトリだけをリダイレクトする

https://efilamola.com/旧ディレクトリ
→ https://efilamola.com/新ディレクトリ

RewriteEngine on
RewriteBase /
RewriteRule ^旧ディレクトリ(.*)$ /新ディレクトリ$1 [R=301,L]

特定のページだけをリダイレクトする

https://efilamola.com/旧ページ.html
→ https://efilamola.com/新ページ.html

RewriteEngine on
RewriteBase /
RewriteRule ^旧ページ.html$ /新ページ.html [R=301,L]

特定のディレクトリをリダイレクトから除外する

除外ディレクトリ以外の全ページ → https://efilamola.com

RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_URI} !(^/除外ディレクトリ/)
RewriteRule ^(.*)$ https://efilamola.com [R=301,L]

!(^/除外ディレクトリ/)!は、否定の意味があります。
※正規表現ではありません。

そのため、「除外ディレクトリ以外の場合」という条件になります。

複数のリダイレクト処理をまとめる方法

複数のリダイレクト処理を行いたい場合、記述をある程度まとめることができます。

RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_URI} ^.*/index\.html$
RewriteRule ^(.*)index.html$ https://efilamola.com/$1 [R=301,L]
RewriteCond %{HTTP_HOST} ^www\.efilamola\.com$ [OR]
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://efilamola.com%{REQUEST_URI} [R=301,L]

RewriteEngine onとRewriteBase /は、一度だけ記述すればOK!

5行目6行目がRewriteCondですが、条件は[OR]を使うことで繋げることができます。

wwwあり、もしくはhttp:://の場合、https://efilamola.comに転送するというようになっています。

リダイレクトでよく使う正規表現

.htaccessでのリダイレクトの際によく使う正規表現を紹介します。

.何でも良い、何かしら1文字
●*●を0回以上繰り返す
^●●から始まる
●$●で終わる
\●
¥●
.など正規表現で特殊な意味を持った文字を、通常の文字として扱う
$1(●)とすでに記述が合った場合、かっこ内の変数となる

これらは正規表現の中でもほんの一部にすぎないのですが、リダイレクト関連はこれだけ知っておけば問題ありません。

えふぃ

それぞれを組み合わせてみましょう!

.* → 何かしらの文字を0回以上繰り返している

^(.*)$ → 上と同じですが、.*を後から$1として使うことができます

^efilamola\.com$
→ efilamola.comで始まり、efilamola.comで終わる
= efilamola.com