【htaccess】どうだった?リダイレクト関連13パターン。ドメイン正規化、ページ内移動、サブドメイン移動、モバイル別、まとめてみたよ
ページを移動した時や、ドメインに引っ越しの際にも色々便利な、htaccess。
そんな便利な記述だけど、実際リダイレクト先は色々なパターンがあるので、判った分だけ網羅しておきますね。

  1. 基本のリダイレクト・ドメイン正規化 www無し https
  2. index.html無しに統一
  3. ドメイン変更
  4. サブドメインからサブドメインなし
  5. サブドメインを別ドメインのディレクトリに移動
  6. ページを移動した・old.htmlからnew.html
  7. 別ページの途中に移動した・ページ内リンク
  8. ディレクトリ名が変わった
  9. ドメインも変わってページも移動した
  10. ディレクトリを丸ごとドメインに移動
  11. ディレクトリを丸ごと別ドメインのディレクトリに移動
  12. 指定したディレクトリ以外を飛ばしたい
  13. デバイスごとに飛ばしたい
  14. 追記:自分のIPだけ入れるようにしてメンテ画面にする
  15. 追記:指定したページを除外して飛ばしたい

初心者向け説明

念の為に最初に書いておきます。
簡単に書くと、リダイレクトとは、サーバーのURLにアクセスした時に、別なURLに飛ばす事です。

リダイレクトするには大抵の場合、htaccessというファイルを使います。
実際は「.(ドット)」がついいるので、「.htaccess」というファイル名で置かれる、中身はテキストファイルです。
大抵はサーバーの public_html フォルダの直下に置きます。

最初からある場合は、リダイレクトの内容をその下に書き足せば、リダイレクトします。
WordPressなどは、最初からありますが、その下に書き足す形ですね。

public_htmlの下位のディレクトリに置くこともできます。
下位のディレクトリに置いた場合は、その下のディレクトリのみリダイレクトされます。

1.基本のリダイレクト(ドメイン正規化 www無し https)

ErrorDocument 404 /404.html
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.domain\.com
RewriteRule ^(.*) http://domain.com/$1 [R=301,L]
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

どういう事が書いてあるかというと
ErrorDocument 404 /404.html … 404の時、404,htmlページを表示する
RewriteEngine On … リライト機能をOnにする
RewriteCond %{HTTP_HOST} ^www\.domain\.com … wwwがついたURLを
RewriteRule ^(.*) http://domain.com/$1 [R=301,L] … www無しのURLに統一する
RewriteCond %{HTTPS} off … httpsではない場合に
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] … httpsをつける

以下からは、RewriteEngine on を略していますので、先に

RewriteEngine on

をつけてくださいね。

2.index.html無しに統一

RewriteCond %{THE_REQUEST} ^.*/index.html
RewriteRule ^(.*)index.html$ https://domain.com/$1 [L,R=301] 

3.ドメイン変更

RewriteRule ^(.*) https://new-domain.com/$1 [R=301,L]

上のテキストを移動前のサーバーの.htaccessに書いてください

4.サブドメインからサブドメインなし

RewriteCond %{HTTP_HOST} ^sub\.domain\.com$
RewriteRule (.*) https://newdomain.com/$1 [R=301,L] 

5.サブドメインを別ドメインのディレクトリに移動

RewriteCond %{HTTP_HOST} ^sub\.domain\.com
RewriteRule ^(.*) https://newdomain.com/subdirectory/$1 [R=301,L] 

6.ページを移動した・old.htmlからnew.html

RewriteEngine on
RewriteRule ^old.html$ /new.html [R=301,L]

よくあるやつです、old.htmlがnew.htmlに引っ越します

7.別ページの途中に移動した・ページ内リンク

RewriteRule ^/old.html /new.html#anchor [NE,R=301,L]

これは使う事ありそうで、ないような?小さいページを一つにまとめた時とか?
ページ内リンク先#anchorに移動します
通常は[R=301,L] だけど[NE,R=301,L]と書く
NEはエンコードさせないための指示です

8.ディレクトリ名が変わった

RewriteRule ^directoryold(.*)$ /directorynew$1 [R=301,L] 

domain.com/directoryold/ から domain.com/directorynew/ になった時

9.ドメインも変わってページも移動した

RewriteRule https://olddomain.com/old/old.html
https://newdomain.com/new/new.html [R=301,L] 

これはピンポイントで指定して移動するときかな

10.ディレクトリを丸ごとドメインに移動

RewriteRule ^olddirectory$ https://newdomain.com [R=301,L] 

…/olddirectory/ を https://newdomain.com/ に移動

11.ディレクトリを丸ごと別ドメインのディレクトリに移動

RewriteRule ^olddirectory$ https://newdomain.com/newdirectory/ [R=301,L] 

…/olddirectory/ を https://newdomain.com/newdirectory/ に移動

12.指定したディレクトリ以外を飛ばしたい

RewriteBase /
RewriteCond %{REQUEST_URI} !(^/tobasanaide/)
RewriteRule ^(.*)$ https://domain.com/ [R=301,L]

13.デバイスごとに飛ばしたい

RewriteCond %{REQUEST_URI} !/sp/
RewriteCond %{HTTP_USER_AGENT} (iPod|iPhone|iPad|Android|Windows\ Phone)
RewriteRule ^(.*)$ sp/$1 [R]
RewriteBase /

RewriteCond %{REQUEST_URI} /sp/
RewriteCond %{HTTP_USER_AGENT} !(iPod|iPhone|iPad|Android|Windows\ Phone)
RewriteRule ^sp/(.*)$ $1 [R]
RewriteBase /

HTTP_USER_AGENTで指定したデバイスを、ドメイン直下の/sp/に飛ばす

デバイス振り分けは最近レスポンシブばかりで忘れていました。
以下を参考にしています。
htaccessによるデバイス振り分け #htaccess - Qiita

そういえば、このリダイレクト、最近のWordPressでは、Redirectionという便利なプラグインがあるらしく、それで設定もできるらしい。
…でも、今まで私が設定したものは、HTML→WordPressとか、既存サイトディレクトリ→オンラインショップURLとか、MT→WPとか、WordPressから飛ばす事なかったので、あまり意味ないような気がします。

という事で
アレ?どうだったっけ?
既存サイトを見て、こうだったかー!
とかやりがちなので、これでなんとかなるはずさー。

追記:

自分のIPだけ入れるようにしてメンテ画面にする

最近あまり使わないので忘れていました。
下記のブログを参考にしてください。役立つ度★★★★★
メンテナンス画面を出すための.htaccessの書き方 | クロジカ
以下のブログは、複雑なリダイレクト方法も書かれています。役立つ度★★★★★
.htaccessによる少し複雑なリダイレクト備忘録 - Fly higher! Sky is the limit!

指定したページを除外して飛ばしたい

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_URI} !(^/subdirectory/tobasanai01.html)
RewriteCond %{REQUEST_URI} !(^/subdirectory/tobasanai02.html)
RewriteRule ^(.*)$ https://newdomain.com/$1 [R=301,L]

上記は
/subdirectory/tobasanai01.html
/subdirectory/tobasanai02.html
以外を https://newdomain.com/にとばします。
指定したディレクトリ以外を飛ばしたいの時と同じく、.htmlの場所を書けばよいです。

参考サイト
【apache】特定のディレクトリを除外してリダイレクトしたい at softelメモ

複数のページやディレクトリを順番に書けば、それが除外されます。
RewriteCond %{REQUEST_URI} !(^/subdirectory/tobasanai01.html)
の「!」が除外の時の指示です。

リダイレクトなどの指示は上から順番に行われていきます。
なので、おかしくなった時は、そのどれかが間違っているか、一行づつ確かめてみるとよいです。

処理には優先順位が指定できたりしまます。
それでハマる事もありました。
詳しくは、以下のサイトが参照になりましたよ。

【WordPress】特定ページ以外のアクセスを別ドメインのサイトにリダイレクトさせる | 電脳備忘録 | 560Days.com