リダイレクト―意味や.htaccessの設定(正規表現やパラメータ)など
技術情報
用語の意味や.htaccessの設定(正規表現やパラメータ)などリダイレクトについて解説しています。
目次
この記事の目次です。
1. リダイレクトとは
2. リダイレクトの失敗事例
3. .htaccessでのリダイレクトの書き方
4. Redirectディレクティブ
5. RedirectMatchディレクティブ
6. 正規表現を利用したリダイレクト
7. mod_rewriteで高度なリダイレクトを行う
具体的なリダイレクトの書き方の例
・すべてのアクセスを同じサイトのページにリダイレクト
・パラメータ付きURLのリダイレクト
・ドメイン変更時のリダイレクト
・スマートフォンを振り分けるリダイレクト
・特定のIPアドレスだけ除外してリダイレクト
・WordPressでもともとのindex.htmlをリダイレクト
・IPアドレスのURLをドメインのURLにリダイレクト
・www有り無しとhttpからhttpsにURL統一するリダイレクト
・日本語や空白を含みURLエンコードされるURLのリダイレクト
・特定のURLを除いてhttpからhttpsにリダイレクト
・.htaccessでのリダイレクトがうまくいかない場合
1. リダイレクトとは
リダイレクトとは、ホームページの表示で指定したURLから自動的に他のURLに転送される、あるいは転送することをいいます。
メールの自動転送など他の意味もある
リダイレクトは、URLリダイレクトやメールの自動転送方法、コマンドラインでの入出力など、いろいろの意味で使われています。 ここでは、ホームページ関連の話題を扱っておりますので、URLリダイレクトのことをリダイレクトと記載しています。
リダイレクトの種類と用途
リダイレクトは、ホームページのドメインの変更やサイトの統合、モバイルユーザ向けページへの転送などURLを自動で切り替える用途で使います。 またフィッシングサイトなど不正な用途でも使われることがあります。
リダイレクトの種類
転送の意味合いにより、主に301リダイレクト(恒久的転送)、302リダイレクト(一時的な転送)の2種類があります。 SEO対策を意識する場合は、正しく検索エンジンに伝えられるようリダイレクトの種別を理解して設定する必要があります。
301リダイレクト(恒久的転送)
301リダイレクトは、恒久的転送を意味するリダイレクトです。 ドメインの変更やホームページの統合などでURLを変更する必要がある場合に利用するリダイレクトです。 SEOにおいては、Googleに移転先のURLを伝えることができ、元のURLの評価PageRank(ページランク)を引き継ぐことから、検索エンジンの順位評価を下げることなくページを移動させることができるといわれています。
302リダイレクト(一時的な転送)
302リダイレクトは、一時的な転送を意味するリダイレクトです。 ホームページの修正などでメンテナンスページを表示する場合などに利用するリダイレクトです。
リダイレクトの実現方法
リダイレクトは、HTMLやJavaScriptの記述、PHPなどのサーバサイドプログラム(WordPressのリダイレクトプラグインなど)、.htaccessのようなWebサーバの設定など、いろいろな方法で実現できます。 共用のレンタルサーバを利用している場合は、.htaccessで設定するのが手軽で便利です。
2. リダイレクトの失敗事例
SEOを考えてリダイレクトを検討されている方も多いと思いますが、注意点もあります。
不正なリダイレクトにならないよう注意
たとえば、新しくホームページを作成する際に、被リンクがたくさんあるオールドドメインを取得するなどして、被リンクのあるURLを新規に作成したURLに転送して、もともとの検索エンジンの順位評価を活用する場合もあるかと思います。
その場合は、もともとのURLの記事と新しい記事の内容が異なるものになってしまうと、閲覧者は不自然に感じたり、ウイルス感染したホームページと感じてしまいますので注意が必要です。 このようなことからGoogleに「不正なリダイレクト」と判定されてしまい、グーグル八分にされないよう元のページと転送先のページの関連もしっかり考慮する必要があります。
中古ドメインとは
中古ドメインとは、以前ホームページで使われていたドメインのことです。 良い状態の場合はSEO効果が期待できるメリットがある反面、悪い状態もあるので注意が必要です。 取得後の運用として引き継いだ被リンクを無理にリダイレクトする場合は注意が必要です。
3. .htaccessでのリダイレクトの書き方
.htaccessでは、Redirect、RedirectMatch、mod_rewriteのいずれかでリダイレクト設定が行えます。
リダイレクト設定
htaccessで設定することでWebサーバの機能を使用してリダイレクトが行えます。 リダイレクト設定は、その他にHTMLやJavaScript、あるいはPHPなどのサーバサイドのプログラムでも行えます。
.htaccessでの301リダイレクトの書き方の例
.htaccessでのリダイレクトの書き方の詳しい解説は、RedirectやRedirectMatch、mod_rewriteなどの章に記載していきますが、ここでは301リダイレクトの書き方について簡単に触れていきます。
例1)redirect permanentで301リダイレクトが行える
Redirectディレクティブを使用した301リダイレクトの例です。 Redirectディレクティブを使用する場合はpermanentを指定るすことでHTTPステータス301を設定したリダイレクトになります。
Redirect permanent /aaa.html https://www.bbb.com/bbb.html
Redirectディレクティブは正規表現が使えませんので、URL毎にリダイレクトのコードを記述する必要があります。
例2)RedirectMatch permanentで正規表現を使用して301リダイレクトが行える
RedirectMatchディレクティブを使用すると正規表現を使用して301リダイレクトが行えます。 以下はすべてのURLを「https://www.bbb.com/bbb.html」にリダイレクトする例です。
RedirectMatch permanent .* https://www.bbb.com/bbb.html
RedirectMatchディレクティブは正規表現は使えますが、条件を指定することができません。
例3)mod_rewriteで条件判定を行って301リダイレクトが行える
mod_rewriteを使用すると条件判定が行えます。以下はwwwのあるURLから、wwwなしのURLに301リダイレクトする例です。
<IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{HTTP_HOST} ^www\.htaccess-support\.com RewriteRule ^(.*)$ https://htaccess-support.com/$1 [R=301,L] </IfModule>
4. Redirectディレクティブ
Redirectディレクティブは古いURLを新しいURLにマップしてリダイレクトします。 AにアクセスしたらBにリダイレクトというように単純なリダイレクトはRedirectディレクティブで行えます。 permanentを指定した301リダイレクトの書き方など、Apache HTTP ServerのRedirectディレクティブについて解説していきます。
5. RedirectMatchディレクティブ
Apache HTTP Serverでは、より複雑な書き換えのために、 RedirectMatchディレクティブを提供しています。
以下は、Aサイトへの全てのリクエストを恒久的な301リダイレクトでBサイトのページにリダイレクトする場合の例です。
RedirectMatch permanent .* https://www.bbb.com/bbb.html
注意点としては、同じサイトのページへのリダイレクトの場合はループしてしまうため上記は使えません。 同じサイトのページへ全てリダイレクトする場合はmod_rewriteを使用する必要があります。
6. 正規表現を利用したリダイレクト
正規表現ルールに基づいて、着信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以外 |
正規表現とは
正規表現とは、いくつかの文字列を一つの形式で表現するための表現方法です。 .htaccessのリダイレクトでは、URLを正規表現で表して使うことが多いので、URLのパターンを表現するのによく使われる正規表現は押さえておきたいです。
.htaccessのリダイレクトでよく使う正規表現
.htaccessのリダイレクトでよく使う正規表現をまとめてみました。
7. 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される対象は、ディレクティブが定義されている場所によって異なります。
具体的なリダイレクトの書き方の例
以降では、さまざまなリダイレクトを行う具体的な.htaccessの書き方の例をまとめています。
すべてのアクセスを同じサイトのページにリダイレクト
メンテナンスや移設後の案内など、全てのアクセスを同じサイト(ドメイン)の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]
パラメータ付きURLのリダイレクト
htaccessのパラメータ付きURLのリダイレクト方法についてまとめていいます。
ドメイン変更時のリダイレクト
ドメイン変更時のリダイレクト設定について見ていきます。
レンタルサーバデフォルトドメインから独自ドメインへリダイレクト
同じ配置場所でレンタルサーバデフォルトドメインから独自ドメインへ切り替える際のリダイレクト設定について見ていきます。
例えば、ロリポップなどのレンタルサーバでデフォルトのドメインを利用していて、レンタルサーバデフォルトドメインの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として、除外することもできます。
その場合のリダイレクト除外設定のイメージは以下になります。
スマートフォンを振り分けるリダイレクト
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を使用したリダイレクトのサンプルを掲載しています。
特定のIPアドレスだけ除外してリダイレクト
RewriteCondで条件設定すれば、特定のIPアドレスだけ除外してリダイレクトする設定も行えます。
RewriteEngine On RewriteCond %{REMOTE_ADDR} !^XXX\.XXX\.XXX\.XXX RewriteRule ^(.*) https://<ドメイン>/ [L,R=301]
※XXXはIPアドレスの数字が入ります。
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の自動編集エリアになりますので、そこには追記しません。
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>
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>
日本語や空白を含み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>
リダイレクト先がエンコード文字の場合
リダイレクト先に日本語などのエンコード文字が含まれる場合はエンコードの「%」に「\」をつけて「\%」にします。
<IfModule mod_rewrite.c> RewriteEngine On RewriteRule ^My\x20Documents/index.html$ https://htaccess-support.com/My\%20Documents/index.html [R=301,L] </IfModule>
特定の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>
.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を使用したリダイレクトのサンプルを掲載しています。
更新履歴
更新履歴になります。
- 2022/4/19 .htaccessでの301リダイレクトの書き方の例を追記しました。
- 2021/1/20 リダイレクトの失敗事例について追記しました。
- 2020/8/15 正規表現を利用したリダイレクトについて追記しました。
- 2020/7/7 スマートフォンを振り分けるリダイレクトについて追記しました。
- 2020/7/5 .htaccessでのリダイレクトがうまくいかない場合について追記しました。
- 2020/6/14 特定のURLを除いてhttpからhttpsにリダイレクトする設定について追記しました。
- 2020/6/8 リダイレクトとは何かについて追記しました。
- 2019/8/28 リダイレクトについての説明を追記しました。
- 2019/8/26 すべてのアクセスを同じサイトのページにリダイレクトする設定について追記しました。
- 2019/8/25 Redirectのpermanent部分のパラメータについて追記しました。
- 2019/8/24 Redirectディレクティブの書き方について追記しました。
- 2019/8/8 記事をアップしました。