目次

この記事の目次です。

1. リダイレクトとは
2. .htaccessでのリダイレクトの書き方
3. Redirectディレクティブ
4. RedirectMatchディレクティブ
5. mod_rewriteで高度なリダイレクトを行う
6. すべてのアクセスを同じサイトのページにリダイレクトする記述例
7. パラメータ付きURLのリダイレクトの記述例
8. ドメイン変更時のリダイレクトの記述例
9. スマートフォンを振り分ける記述例
10. 特定のIPアドレスだけ除外してリダイレクトする記述例
11. WordPressでもともとのindex.htmlをリダイレクトする記述例
12. IPアドレスのURLをドメインのURLにリダイレクトする記述例
13. www有り無しとhttpからhttpsにURL統一するリダイレクトの記述例
14. 日本語や空白を含みURLエンコードされるURLのリダイレクトの記述例
15. 特定のURLを除いてhttpからhttpsにリダイレクトする記述例
16. .htaccessでのリダイレクトがうまくいかない場合

更新履歴

1. リダイレクトとは

リダイレクトとは、ホームページの表示で指定したURLから自動的に他のURLに転送される、あるいは転送することをいいます。

メールの自動転送など他の意味もある

リダイレクトは、URLリダイレクトやメールの自動転送方法、コマンドラインでの入出力など、いろいろの意味で使われています。 ここでは、ホームページ関連の話題を扱っておりますので、URLリダイレクトのことをリダイレクトと記載しています。

リダイレクトの種類と用途

リダイレクトは、ホームページのドメインの変更やサイトの統合、モバイルユーザ向けページへの転送などURLを自動で切り替える用途で使います。 またフィッシングサイトなど不正な用途でも使われることがあります。

リダイレクトの種類

転送の意味合いにより、主に301リダイレクト(恒久的転送)、302リダイレクト(一時的な転送)の2種類があります。 SEO対策を意識する場合は、正しく検索エンジンに伝えられるようリダイレクトの種別を理解して設定する必要があります。

301リダイレクト(恒久的転送)

301リダイレクトは、恒久的転送を意味するリダイレクトです。 ドメインの変更やホームページの統合などでURLを変更する必要がある場合に利用するリダイレクトです。 SEOにおいては、Googleに移転先のURLを伝えることができ、元のURLの評価PageRank(ページランク)を引き継ぐことから、検索エンジンの順位評価を下げることなくページを移動させることができるといわれています。

302リダイレクト(一時的な転送)

302リダイレクトは、一時的な転送を意味するリダイレクトです。 ホームページの修正などでメンテナンスページを表示する場合などに利用するリダイレクトです。

不正なリダイレクトにならないよう注意

たとえば、新しくホームページを作成する際に、被リンクがたくさんあるオールドドメインを取得するなどして、被リンクのあるURLを新規に作成したURLに転送して、もともとの検索エンジンの順位評価を活用する場合もあるかと思います。

その場合は、もともとのURLの記事と新しい記事の内容が異なるものになってしまうと、閲覧者は不自然に感じたり、ウイルス感染したホームページと感じてしまいますので注意が必要です。 このようなことからGoogleに「不正なリダイレクト」と判定されてしまい、グーグル八分にされないよう元のページと転送先のページの関連もしっかり考慮する必要があります。

リダイレクトの実現方法

リダイレクトは、HTMLやJavaScriptの記述、PHPなどのサーバサイドプログラム(WordPressのリダイレクトプラグインなど)、.htaccessのようなWebサーバの設定など、いろいろな方法で実現できます。 共用のレンタルサーバを利用している場合は、.htaccessで設定するのが手軽で便利です。

2. htaccessでのリダイレクト設定

.htaccessでは、Redirect、RedirectMatch、mod_rewriteのいずれかでリダイレクト設定が行えます。

リダイレクト設定

htaccessで設定することでWebサーバの機能を使用してリダイレクトが行えます。 リダイレクト設定は、その他にHTMLやJavaScript、あるいはPHPなどのサーバサイドのプログラムでも行えます。

3. Redirectディレクティブ

AにアクセスしたらBにリダイレクトというように単純なリダイレクトはRedirectディレクティブで行えます。

Redirect permanent /aaa.html https://www.bbb.com/bbb.html

Redirectディレクティブの書き方

Redirectディレクティブは古いURLを新しいURLにマップしてリダイレクトします。

Redirect permanent <古いURL(URLのパス部分)> <新しいURL(URL全部表記)>

古いURL(URLのパス部分)の書き方

古いURLは、%形式のURLエンコードされたURLはデコードされたURLを書きます。 また、/から始まるコンテンツのルートからのパスを書きます。相対パスは使用できません。

新しいURL(URL全部表記)の書き方

新しいURLはURL全部表記です。http://やhttps://のスキーム部分から、ドメイン名などのホスト名とURLのパス部分を全て書くのが基本です。 URLのパス部分からの表記で記述した場合、現在のスキームとホスト名が適用されます。

Redirectのpermanent部分のパラメータ

permanent部分のパラメータについてです。

permanent

permanentは、永久にリダイレクトをするステータス (301) を返します。これはリソースが永久に移動したということを意味します。 サイトリニューアルなどではSEOの評価を引き継ぐ目的で301を使うのが望ましいといわれています。

temp

tempは、パラメータ未指定の時に適用され、一時的なリダイレクトステータス (302) を返します。

seeother

seeotherは、リソースが他のもので置き換えられたことを意味するステータス (303) を返します。

gone

goneは、リソースが永久に 削除されたことを意味します。この指定を適用する場合は、 url引数は省略する必要があります。

URLが完全に一致したら適用される

Redirectディレクティブは、URLが完全に一致したら適用されます。部分一致で適用させたい場合は正規表現が使用できるRedirectMatchディレクティブを使用してください。

4. RedirectMatchディレクティブ

Apache HTTP Serverでは、より複雑な書き換えのために、 RedirectMatchディレクティブを提供しています。

以下は、Aサイトへの全てのリクエストを恒久的な301リダイレクトでBサイトのページにリダイレクトする場合の例です。

RedirectMatch permanent .* https://www.bbb.com/bbb.html

注意点としては、同じサイトのページへのリダイレクトの場合はループしてしまうため上記は使えません。 同じサイトのページへ全てリダイレクトする場合はmod_rewriteを使用する必要があります。

正規表現

正規表現ルールに基づいて、着信URL要求を動的に変更する方法を提供します。 ある特定の条件の文字列を表現するために正規表現という機能があります。mod_rewriteはPerl互換正規表現語彙を使います。

文字意味
.任意の1文字に一致f.tとした場合、fit
+直前の文字の1回以上の繰り返しa+とした場合、aa、aaaなど
*直前の文字の0回以上の繰り返しa*とした場合、a、aa、aaaなど
?直前の文字は省略可能a?aとした場合、a、aaなど
^文字列の先頭に一致^aとした場合aから始まる文字列
$文字列の末尾に一致a$とした場合、aで終わる文字列
( )( )内を1文字として扱う(ab)+とした場合、abab、abababなど
[ ][ ]の中のどれか1文字c[uoa]tの場合、cut、cot、catのいずれか
[^ ][ ]の中に無い1文字c[^/]tの場合c/t以外

5. mod_rewriteで高度なリダイレクトを行う

複雑な条件で高度なリダイレクトを行う場合はmod_rewriteの機能を使います。

mod_rewriteによるリダイレクトの例

mod_rewriteは、ブラウザの種類、リクエスト元のIPアドレスなどのリクエストの特徴を 使って送り返すコンテンツの場所を決めます。 さらに、mod_rewriteは外部のデータベースファイルやプログラムを使ってリクエストの扱い方を 決めることもできます

RewriteEngine on
RewriteRule ^<アクセスファイル>$ <リダイレクトURL> [L,R=301]

RewriteEngineディレクティブ

RewriteEngineディレクティブはmod_rewriteの機能を有効化または無効化します。

RewriteRuleディレクティブ

RewriteRuleディレクティブは、実際にURLの書換えを行う命令を記述します。perl互換の正規表現が使えます。 RewriteRuleされる対象は、ディレクティブが定義されている場所によって異なります。

6. すべてのアクセスを同じサイトのページにリダイレクトする記述例

メンテナンスや移設後の案内など、全てのアクセスを同じサイト(ドメイン)の1つのページにリダイレクトしたい場合の設定について見ていきます。

たとえば、トップページ(/index.htmlあるいは/)にリダイレクトする場合の指定は以下になります。

RewriteEngine On
RewriteCond %{REQUEST_URI} !^/$
RewriteCond %{REQUEST_URI} !^/index.html$
RewriteRule ^(.*) /index.html [R,L]

CSSやJS、画像がある場合

CSSやJS、画像を取り込んでトップページを表示している場合はこれらも考慮する必要があります。

RewriteEngine On
RewriteCond %{REQUEST_URI} !^/$
RewriteCond %{REQUEST_URI} !^/index.html$
RewriteCond %{REQUEST_URI} !.css$
RewriteCond %{REQUEST_URI} !.js$
RewriteCond %{REQUEST_URI} !.ico$
RewriteCond %{REQUEST_URI} !.png$
RewriteCond %{REQUEST_URI} !.jpg$
RewriteCond %{REQUEST_URI} !.gif$
RewriteRule ^(.*) /index.html [R,L]

7. パラメータ付きURLのリダイレクトの記述例

パラメータ付きURLのリダイレクト設定について見ていきます。

別のURLでパラメータを引き継ぐ

別のURLでパラメータを引き継ぐ場合はURLの「?」以降を記述しなければそのまま引き継がれます。

例えば、「http://<ドメイン>/before/index.php?aaa=bbb」のアクセスをパラメータを変えずに「https://<ドメイン>/index.php?aaa=bbb」にパラメータを引き継いでリダイレクトする場合です。

RewriteEngine on
RewriteRule ^before/index.html$ https://<ドメイン>/index.php [R=301,L]

別のURLでパラメータを引き継がない

別のURLでパラメータを引き継がない場合はURLの「?」だけつけて「?」以降を記述しないようにします。

例えば、「http://<ドメイン>/before/index.php?aaa=bbb」のアクセスをパラメータを付与しない「https://<ドメイン>/index.php」にリダイレクトする場合です。

RewriteEngine on
RewriteRule ^before/index.html?$ https://<ドメイン>/index.php [R=301,L]

別のURLでパラメータを上書きする

別のURLでパラメータを上書きする場合はURLの「?」以降を記述します。

例えば、「http://<ドメイン>/before/index.php?aaa=bbb」のアクセスをパラメータを変えずに「https://<ドメイン>/index.php?page=ddd」にパラメータを引き継いでリダイレクトする場合です。

RewriteEngine on
RewriteRule ^before/index.html$ https://<ドメイン>/index.php?page=ddd [R=301,L]

別のURLでパラメータを引き継ぎつつ付加する

別のURLで別のURLでパラメータを引き継ぎつつ付加する場合はURLの「?」以降を記述し、「QSA」を指定します。

例えば、「http://<ドメイン>/before/index.php?aaa=bbb」のアクセスをパラメータを変えずに「https://<ドメイン>/index.php?page=ddd&aaa=bbb」にパラメータを引き継いでリダイレクトする場合です。

RewriteEngine on
RewriteRule ^before/index.html$ https://<ドメイン>/index.php?page=ddd [R=301,QSA,L]

8. ドメイン変更時のリダイレクトの記述例

ドメイン変更時のリダイレクト設定について見ていきます。

レンタルサーバデフォルトドメインから独自ドメインへリダイレクト

同じ配置場所でレンタルサーバデフォルトドメインから独自ドメインへ切り替える際のリダイレクト設定について見ていきます。

例えば、ロリポップなどのレンタルサーバでデフォルトのドメインを利用していて、レンタルサーバデフォルトドメインのURLがhttp://rental.host.com~をhttps://my.domain.com~に切り替える場合の例はいかになります。

RewriteEngine On
RewriteCond %{HTTP_HOST} ^rental\.host\.com
RewriteRule ^(.*) https://my.domain.com/$1 [R=301,L]

一部を除外してリダイレクトする設定

mod_rewriteでは、一部を除外してリダイレクトすることも行えます。

例えば、以下のようにRewriteCondの否定の「!」をつけた条件を付けて以下のようにすれば正規表現のパターンに一致したディレクトリやパスのリダイレクトが除外できます。

RewriteEngine On
RewriteCond %{REQUEST_URI} !^/<除外ディレクトリ>/
RewriteRule ^(.*) https://<ドメイン>/ [L,R=301]

下層ディレクトリを除外する場合

全体をリダイレクトにかけ、一部の下層ディレクトリを除外する場合は、.htaccessは下層ディレクトリに配置された方が優先されますので、除外する下層ディレクトリに.htaccessを置いてRewriteEngine Offとして、除外することもできます。

その場合のリダイレクト除外設定のイメージは以下になります。

リダイレクト除外設定のイメージ

9. スマートフォンを振り分ける記述例

mod_rewriteを使用すれば、.htaccessでスマートフォン用のコンテンツに振り分けられます。

以下は、スマホ用のコンテンツを「https://<ドメイン>/<スマホ用ディレクトリ名>/」に振り分ける場合の例です。

RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} (iPhone|Android.*Mobile|Windows.*Phone) [NC]
RewriteRule ^(.*) https://<ドメイン>/<スマホ用ディレクトリ名>/$1 [R,L]

一部レスポンシブに対応している状態でsp(スマホ用ディレクトリ)に飛ばす

一部レスポンシブで作っている状態のときに、特定のURLは/sp/を付けて、スマホディレクトリに飛ばすhtaccessを記述する場合の例です。 将来的にはすべてレスポンシブ化されるのが理想ですので、レスポンシブに対応していないURLのディレクトリだけ除外します。

特定ディレクトリの除外は簡単です。.htaccessは下層が優先されますので、特定ディレクトリに.htaccess置けば、そこだけ/sp/を付けて、スマホディレクトリに飛ばすことができます。

# 特定ディレクトリに以下を記述した.htaccessを置く
RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} (iPhone|Android.*Mobile|Windows.*Phone) [NC]
RewriteRule ^(.*) https://<ドメイン>/<スマホ用ディレクトリ名>/$1 [R,L]

同じディレクトリでレスポンシブ対応ページがある状態でスマホ用URLに飛ばす

同じディレクトリでレスポンシブ対応ページがある状態でスマホ用URLに飛ばす場合は、将来なくなると想定されるURLですので、無理に.htaccessを使わない方が煩雑にならず管理しやすいと思います。

レスポンシブ未対応のページのheadタグ内に以下のJavaScriptによるリダイレクトの記述を追記してみてはいかがでしょうか。

JavaScriptのlocation.href

JavaScriptのlocation.hrefについての解説、スマホリダイレクトなどのJavaScriptのlocation.hrefを使用したリダイレクトのサンプルを掲載しています。

詳細

10. 特定のIPアドレスだけ除外してリダイレクトする記述例

RewriteCondで条件設定すれば、特定のIPアドレスだけ除外してリダイレクトする設定も行えます。

RewriteEngine On
RewriteCond %{REMOTE_ADDR} !^XXX\.XXX\.XXX\.XXX
RewriteRule ^(.*) https://<ドメイン>/ [L,R=301]

※XXXはIPアドレスの数字が入ります。

11. WordPressでもともとのindex.htmlをリダイレクトする記述例

WordPressにホームページを切り替えた際に、もともとのトップページのindex.htmlのアクセスがNot Foundになってしまう場合は以下の赤字のようにリダイレクト設定すると解消できます。


<IfModule mod_rewrite.c>
RewriteRule ^index\.html?$ / [L,R=301]
</IfModule>

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress

※# BEGIN WordPressと# END WordPressの間はWordPressの自動編集エリアになりますので、そこには追記しません。

12. IPアドレスのURLをドメインのURLにリダイレクトする記述例

アクセス解析を行っているとドメインのURLでアクセスしてほしいのにIPアドレスのURLでアクセスされることがあります。 以下のようにしてドメインのURLに統一することができます。

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_HOST} ^XXX\.XXX\.XXX\.XXX$
RewriteRule (.*) https://<ドメイン\.com>/$1 [R=301,L]
</IfModule>

13. www有り無しとhttpからhttpsにURL統一するリダイレクトの記述例

URL統一する場合、ドメインのwww有り無しとhttpからhttpsへと同時に実現したいですね。 その場合の設定例になります。

wwwなしでhttpsに統一

wwwなしでhttpsに統一する例です。

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.htaccess-support\.com
RewriteRule ^(.*)$ https://htaccess-support.com/$1 [R=301,L]

RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://htaccess-support.com/$1 [R=301,L]
</IfModule>

wwwありでhttpsに統一

wwwありでhttpsに統一する例です。

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP_HOST} ^htaccess-support\.com
RewriteRule ^(.*)$ https://www.htaccess-support.com/$1 [R=301,L]

RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://www.htaccess-support.com/$1 [R=301,L]
</IfModule>

サブディレクトリにリダイレクトルールを適用する場合

ルート(/)ではなく、サブディレクトリにリダイレクトルールを適用する場合の例です。 subdirのところを記述する.htaccessのパスに合わせます。

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.htaccess-support\.com
RewriteRule ^(.*)$ https://htaccess-support.com/subdir/$1 [R=301,L]

RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://htaccess-support.com/subdir/$1 [R=301,L]
</IfModule>

14. 日本語や空白を含みURLエンコードされるURLのリダイレクトの記述例

日本語や空白を含みURLエンコードされるURLをリダイレクトする場合は、ブラウザのアドレスバーでコピー&ペーストして%XXの文字にエンコードされる部分の%を\xに置き換えることでリダイレクトできます。

半角空白を含んだURLのリダイレクト

半角空白はブラウザのアドレスバーでコピー&ペーストするとURLエンコードが行われ%20に変換されます。 これを「\x20」すろことでReriteRuleで認識されるようになります。

たとえば「My Documents」という文字列は「My%20Documents」とURLエンコードされます。 .htaccessのRewiteRuleでは「My\x20Documents」と記述します。

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^My\x20Documents/index.html$ https://htaccess-support.com/ [R=301,L]
</IfModule>

15. 特定のURLを除いてhttpからhttpsにリダイレクトする記述例

特定のURLだけ分け合ってhttps化できない場合に特定のURLを除いてhttpからhttpsにリダイレクトする設定です。 URLはwwwなしで統一するとします。

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.htaccess-support\.com
RewriteRule ^(.*)$ http://htaccess-support.com/$1 [R=301,L]

RewriteCond %{REQUEST_URI} !^/not_ssl_page\.html
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://htaccess-support.com/$1 [R=301,L]

RewriteCond %{HTTPS} on
RewriteRule ^not_ssl_page.html$ http://htaccess-support.com/not_ssl_page.html [R=301,L]
</IfModule>

16. .htaccessでのリダイレクトがうまくいかない場合

.htaccessでのリダイレクトがうまくいかない場合の参考です。

ApacheではなくNginxやIISを使用している

.htaccessはApache HTTP Serverの設定ファイルです。 Web公開に使用するサーバーのソフトウェアがApacheではない場合、.htaccessは使用できません。

mod_rewriteが許可されていない

Web公開に使用するサーバーのソフトウェアがApacheでも、mod_rewriteが許可されていない場合、mod_rewriteを使用したRewriteRuleを記述してもリダイレクトできません。

JavaScriptによるリダイレクト

Apacheに対応していなくNginxなど設定変更に再起動が必要な場合や、他にリダイレクトを.htaccessで行っていてURLも共通的なページでないなどリダイレクトが複雑になりやすい、 そのようなときは、.htaccessではなく、該当ページにJavaScriptコードでのリダイレクトがおすすめです。

JavaScriptのlocation.href

JavaScriptのlocation.hrefについての解説、スマホリダイレクトなどのJavaScriptのlocation.hrefを使用したリダイレクトのサンプルを掲載しています。

詳細

更新履歴

更新履歴になります。

位置:トップリダイレクト