.htaccessでリダイレクトする方法6選

Apache

Apacheの設定ファイル.htaccessを使うと、リダイレクトやアクセス制御といった機能が使えます。

サーバーを再起動が不要で、ファイルを書き換えるだけで使えるので、.htaccessが使えるレンタルサーバーも多いですね。

ただ、.htaccessでリダイレクトするだけとはいっても、さまざまなやり方があり、状況に合わせて適切な設定を選ぶ必要があります。

この記事では、.htaccessでリダイレクトする具体例を6つ紹介します。

Redirect・RedirectMatch・RewriteRuleディレクティブでリダイレクトする

.htaccessファイルでリダイレクトするには、Redirect/RedirectMatch/RewriteRuleディレクティブのいずれかを使います。

ディレクティブ説明
Redirectドメインの移行や、ディレクトリ単位でのURL移行など、サイト全体やディレクトリ単位でのリダイレクトを行う。
1つのURLだけの移行には向いていない。
RedirectMatchRedirectに似ているが、正規表現でリダイレクト元URLを指定できる。
また、後方参照を使うことでリダイレクト先も柔軟に指定できる。
1つのURLだけの移行に最適。
RewriteRuleクエリー文字列を利用したリダイレクトなど、さらに高度なリダイレクトのときはRewriteCondと組み合わせて使う。
また、既にRewriteRuleでリダイレクトしているときは、たいていの場合、RewriteRuleを使わないといけない。

Redirectディレクティブ

Redirectディレクティブは、ドメイン移行やディレクトリ名の変更など、サイト全体もしくはディレクトリ全体のURL変更に伴うリダイレクトで使います。

Redirect <旧URLパス> <新URL>

旧URLパスは/から始まるURLパスを、新URLはhttps://から始まる絶対URLを指定します。

301リダイレクトするには、Redirectの後に301を記述します。

Redirect 301 <旧URLパス> <新URL>

Redirectディレクティブは、<旧URLパス>から始まるURLすべてがリダイレクトの対象になります。たとえば、https://egatech.net の .htaccess ファイルを次のように設定したとします。

Redirect 301 / https://example.com/

このとき、アクセスURLとリダイレクト先URLの関係は次のようになります。

アクセスURLリダイレクト先URL
https://egatech.net/https://example.com/
https://egatech.net/foohttps://example.com/foo
https://egatech.net/bar?bazhttps://example.com/bar?baz

RedirectMatchディレクティブ

RedirectMatchディレクティブは、正規表現を使うことで、特定のURLだけをリダイレクトする用途に使えます。

RedirectMatch <旧URLパスの正規表現> <新URL>

301リダイレクトするには、Redirectの後に301を記述します。

RedirectMatch 301 <旧URLパス> <新URL>

RedirectとRewriteMatchは似ていますが、2つ違いがあります。

RedirectMatchディレクティブは、旧URLに正規表現が使え、新URLには後方参照できる変数として$1, $2, ・・・が使えます。

また、Redirectディレクティブは、旧URLの後ろのパスが新URLにも引き継がれますが、RedirectMatchは後方参照を行わない限り、旧URLのパスが引き継がれません

このような違いがあるので、RedirecMatchは特定のURLだけをリダイレクトするときに使います。

たとえば、https://egatech.net の .htaccess ファイルを次のように設定したとします。

RedirectMatch 301 ^/posts/25$ https://egatech.net/posts/htaccess-redirect

このとき、アクセスURLとリダイレクト先URLの関係は次のようになります。

アクセスURLリダイレクト先URL
https://egatech.net/posts/25https://egatech.net/posts/htaccess-redirect
https://egatech.net/posts/25?foohttps://egatech.net/posts/htaccess-redirect?foo

RewriteRuleディレクティブでのリダイレクト

RewriteRuleディレクティブは、リダイレクトだけではなく、アクセス許可やProxyなど、様々な処理が行えるディレクティブです。RewriteCondと組み合わせることで、複雑な条件下でのリダイレクトも行うことができます。

RewriteRuleでリダイレクトをするには、次のように記述します。

RewriteEngine On
RewriteRule <旧URLパスの正規表現> <新URL> [R,L]

301リダイレクトの時は、R=301と指定します。

RewriteEngine On
RewriteRule <旧URLパスの正規表現> <新URL> [R=301,L]

.htaccessでRewriteRuleを使うときの注意点は、旧URLパスには先頭の/を含めないことです。

たとえば、すべてのURLを新しいドメインに301リダイレクトするときは、次のように記述します。

RewriteEngine On
RewriteRule ^(.+)?$ https://example.com/$1 [R=301,L]

このように、RewriteRuleやRewriteCondは使い方が難しく、単にリダイレクトする目的ならRedirectやRedirectMatchをおススメします。

RewriteRuleで注意が必要なのが、RedirectやRedirectMatchよりも処理の優先度が高いことです。設定ファイルでの記述位置には関係せず、必ずRewriteRuleのリダイレクトが先に処理されます。RedirectとRewriteRuleを組み合わせると、想定外の動作になることが多いので、「Redirect+RedirectMatch」に統一するか、「RewriteRuleだけ」に統一するか、どちらかにしましょう。

.htaccessでHTTPからHTTPSへリダイレクトする

HTTPからHTTPSへリダイレクトするには、<If>ディレクティブとRedirectディレクティブを組み合わせます。

たとえば、http://egatech.net から https://egatech.net に.htaccessでリダイレクトするには、次のように指定します。

<If "%{REQUEST_SCHEME} == 'http'">
  Redirect / https://egatech.net/   
</If>

ELB(Classic Load Balancer)を使っている場合は、Apacheには常にHTTPで接続されるため、X-Forwarded-Protoヘッダの値でHTTPかHTTPSかを判断します。

<If "req('X-Forwarded-Proto') == 'http'">
  Redirect / https://egatech.net/   
</If>

.htaccessで旧ドメインから新ドメインへリダイレクト

ドメイン移行に伴う301リダイレクトを行うときは、Redirectディレクティブを使います。

たとえば、https://egatech.net を https://example.com に移行するときは、次のような.htaccessを記述します。

Redirect 301 / https://example.com/

.htaccessで旧ディレクトリから新ドメインへリダイレクト

一部ディレクトリを新ドメインとして独立させるような場合は、Redirectディレクティブを使います。

たとえば、https://example.com/blog/ を https://blog.example.com に移行するときは、次のように指定します。

Redirect 301 /blog/ https://blog.example.com/

.htaccessで1つのURLだけを新URLへリダイレクト

WordPressの1記事だけをリダイレクトされるようなときは、RedirectMatchを使います。

たとえば、https://example.com/archives/123 を https://example.com/htaccess-redirect/ に301リダイレクトするときは、次のように指定します。

RedirectMatch 301 ^/archives/123$ https://example.com/htaccess-redirect/

.htaccessで複数のURLを1つのURLへリダイレクト

ページの統合や削除などで、複数のURLをある1つのURLにリダイレクトしたいときがあります。

そのような場合は、RedirectMatchディレクティブを使います。

たとえば、https://example.com/centos8/ と https://example.com/centos7/ を https://example.com/centos/ にリダイレクトするときは、次のように指定します。

RedirectMatch ^/(centos8|centos7)/$ https://example.com/centos/

.htaccessで複数のRedirectディレクティブを書いたときは?

Redirectディレクティブは、.htaccessに書いた順番に処理されます。

たとえば、次のような.htaccessを記述したとします。

Redirect /blog/           https://example.com/
Redirect /blog/wordpress/ https://wordpress.com/

この場合、/blog/wordpress/にアクセスすると、wordpress.comではなく、example.comの方にリダイレクトされてしまいます。

正しく処理されるには、次のようにURLパスが深い順に記述します。

Redirect /blog/wordpress/ https://wordpress.com/
Redirect /blog/           https://example.com/

できるだけRedirect/RedirectMatchディレクティブを使おう

以上、.htaccessでのリダイレクト方法を紹介しました。

設定を簡単にするポイントは、なるだけRedirect/RedirectMatchディレクティブを使うこと。<If>ディレクティブと組み合わせれば、ほとんどのリダイレクトはRewriteRuleを使わずに実現できるはずです。

RewriteRuleでリダイレクトが書いてあって、設定ファイルがカオスになっているときは、「Redirect/RedirectMatchに書き直せないか?」を検討してみてください。