Apacheの設定ファイル.htaccessを使うと、リダイレクトやアクセス制御といった機能が使えます。
サーバーを再起動が不要で、ファイルを書き換えるだけで使えるので、.htaccessが使えるレンタルサーバーも多いですね。
ただ、.htaccessでリダイレクトするだけとはいっても、さまざまなやり方があり、状況に合わせて適切な設定を選ぶ必要があります。
この記事では、.htaccessでリダイレクトする具体例を6つ紹介します。
Redirect・RedirectMatch・RewriteRuleディレクティブでリダイレクトする
.htaccessファイルでリダイレクトするには、Redirect/RedirectMatch/RewriteRuleディレクティブのいずれかを使います。
ディレクティブ | 説明 |
---|---|
Redirect | ドメインの移行や、ディレクトリ単位でのURL移行など、サイト全体やディレクトリ単位でのリダイレクトを行う。 1つのURLだけの移行には向いていない。 |
RedirectMatch | Redirectに似ているが、正規表現でリダイレクト元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/foo | https://example.com/foo |
https://egatech.net/bar?baz | https://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/25 | https://egatech.net/posts/htaccess-redirect |
https://egatech.net/posts/25?foo | https://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をおススメします。
.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に書き直せないか?」を検討してみてください。