.htaccessによるURL転送パターン
.htaccessファイルを利用したURLの転送の記載方法は1つではありません。
mod_rewrite、mod_alias などのモジュールを利用して転送を行うことができます。
そうした記述方法の違いによって、
.htaccessのURL転送を難しくしている部分があるかもしれません。
ここではそれぞれの記述方法と実際の動作をご紹介します。
.htaccessファイルを利用したURLの転送は、
自分が管理(レンタル)しているApacheサーバ上のアクセスを、
特定のURLに対してURL転送を行うための設定です。
その為、無料ブログや無料サーバなどで
.htaccessファイルの利用を認めていない環境では利用することができません。
そうした場合には、metaタグやJavaScriptなどを利用して、
少なくとも一旦は自身が管理している.htaccessが利用できるサーバーへの転送が必要です。
その他のURL転送の方法は以下でご紹介しています。
URL転送の各ディレクティブの種類と例
.htaccessファイルを利用したURL転送では、
目的に応じたディレクティブを採用することができます。
こうした記述方法の違いが .htaccessによるURL転送を、
難しく感じさせてしまう要因かもしれませんが、
どのURL転送で行っても意図したステータスコードを返すことができますし、
転送の目的に応じて使い分けるといいと思います。
- Redirect
転送時のステータスコードを指定した単純一致による転送を行う場合に便利です。 - RedirectPermanent (恒久転送のみ)
常に恒久的な転送を単純一致によって行う場合に便利です。 - RedirectTemp (一時転送のみ)
常に一時的な転送を単純一致によって行う場合に便利です。 - Redirect Match
転送時のステータスコードを指定しかつ、
正規表現を用いた一致条件を指定する場合に便利なディレクティブです。 - mod_rewrite
転送時のステータスコードの指定や、
正規表現による一致だけでなく、その他のアクセス条件(IPやホスト名など)によって、
転送の要否などを細かく制御するような転送に便利です。
各転送例と利用できる機能
ディレクティブ | ステータスコード | 正規表現 | 置換条件 |
---|---|---|---|
Redirect | 指定可 | - | - |
RedirectPermanent | 301固定 | - | - |
RedirectTemp | 302固定 | - | - |
Redirect Match | 指定可 | 〇 | - |
mod_rewrite | 指定可 | 〇 | 〇 |
※「置換条件」とは正規表現の条件指定ではなく、
正規表現による置換判定を行うか否かを判断するその他の条件が指定可能なことを示す。
Redirect によるURL転送
Redirectディレクティブを利用したURL転送は、
.htaccessで転送する際に一番利用されるディレクティブかと思います。
mod_alias – Apache HTTP サーバ バージョン 2.2|Redirect ディレクティブ
Redirect ディレクティブ
説明: クライアントが違う URL を取得するように外部へのリダイレクトを 送る 構文: Redirect [status] URL-path URL コンテキスト: サーバ設定ファイル, バーチャルホスト, ディレクトリ, .htaccess 上書き: FileInfo ステータス: Base モジュール: mod_alias Redirect ディレクティブは古い URL を新しいものへマップして、 クライアントに新しい場所を訪れるように指し示します。
古い URL-path (% が復号された) パスは、 スラッシュで始まるものです。相対パスは使用できません。 新しい URL は絶対 URL 、つまりスキームとホスト名で 始まるものであるべきですが、URL-path の、スラッシュで始まるものも 使用可能です。その場合は、現在のスキームとホスト名が追加されたことに なります。
URL-Path で始まるどんなリクエストも、ターゲットの URL へとリダイレクトが返されます。URL-Path にマッチした path 情報は、ターゲット URL の後ろに追加された 形で引き継がれます。
例
Redirect /service http://foo2.example.com/service
クライアントは http://example.com/service/foo.txt へのリクエストを行なうと、代わりに http://foo2.example.com/service/foo.txt をアクセスするように告げられます。 パスセグメントが完全に一致したもののみがマッチしますので、 上記の例は http://example.com/servicefoo.txt にはマッチしません。 正規表現を使ったより複雑なマッチングについては、 RedirectMatchディレクティブをご覧ください。
記述は、構文の通りですが、ステータス([status])には以下が利用できます。
- permanent
永久にリダイレクトをするステータス (301) を返します。 これはリソースが永久に移動したということを意味します。- temp
一時的なリダイレクトステータス (302) を返します。これがデフォルトです。- seeother
“See Other” ステータス (303) を返します。 これはリソースが他のもので置き換えられたことを意味します。- gone
“Gone” ステータス (410) を返します。これはリソースが永久に 削除されたことを意味します。このステータスが使用された場合、 url 引数は省略されなければなりません。
また、 ステータス([status])にはコードを割り当てることができます。
Status の値にステータスコードを数値で与えることで 他のステータスコードも返すことができます。ステータスが 300 と 399 の間にある場合、url 引数は存在していなければいけません。 その他の場合は省略されていなければなりません。ただし、 ステータスは Apache のコードが知っているものである必要があります (http_protocol.c の関数 send_error_response を見てください)。
例
Redirect permanent /one http://example.com/two
Redirect 303 /three http://example.com/other
Redirectディレクティブを利用したURL転送では、
要求されたパスを絶対URLに転送を行うシンプルなURL転送に利用できます。
恒久転送(permanent)
恒久的な転送(一時的でない永続的なURLの変更)を行う場合には、
ステータスコード(301)または、 permanent を指定してURLの転送を行います。
実際にRedirectディレクティブを利用して、
転送を行っているサンプルURLは以下です。
このディレクトリへ配置している.htaccessファイルは以下のようになっています。
これによって、 http://fc2.freeblg.info/transfer/ht_redirect_permanent/ に対して、
アクセスがあった場合は、 http://fc2.freeblg.info/transfer/ へ、
permanent(301)転送が行われます。
エラーが発生しました。後でもう一度やり直してください。 |
curl -i -L http://fc2.freeblg.info/transfer/ht_redirect_permanent/
実際にcURLによってアクセスを行った際のヘッダ情報は以下のようになります。
エラーが発生しました。後でもう一度やり直してください。 |
cURLでは、-L(Location)を指定して確認している為、
転送先のURLにおいてもステータスコードの出力が行われています。
上段の301(Moved Permanently)として転送され、
転送先では200(OK)を正常に受け取っています。
一時転送(temp)
一時的なURL転送を行う場合には、
ステータスコード(302)または、 temp を指定してURLの転送を行います。
実際にRedirectディレクティブを利用して転送を行っているサンプルURLは以下です。
このディレクトリへ配置している.htaccessファイルは以下のようになっています。
これによって、 http://fc2.freeblg.info/transfer/ht_redirect_temp/ に対して、
アクセスがあった場合は、 http://fc2.freeblg.info/transfer/ へ、
temp(302)転送が行われます。
エラーが発生しました。後でもう一度やり直してください。 |
curl -i -L http://fc2.freeblg.info/transfer/ht_redirect_temp/
実際にcURLによってアクセスを行った際のヘッダ情報は以下のようになります。
エラーが発生しました。後でもう一度やり直してください。 |
上段の302(Found)として転送され、転送先では200(OK)を正常に受け取っています。
RedirectPermanent によるURL転送(恒久)
稀に上記のRedirect Permanent と混在してこの表記がされている場合もありますが、
基本的には全く同じものとされています。
mod_alias – Apache HTTP サーバ バージョン 2.2|RedirectPermanentディレクティブ
RedirectPermanentディレクティブ
説明: クライアントが違う URL を取得するように外部への永久的な リダイレクトを送る 構文: RedirectPermanent URL-path URL コンテキスト: サーバ設定ファイル, バーチャルホスト, ディレクトリ, .htaccess 上書き: FileInfo ステータス: Base モジュール: mod_alias このディレクティブはクライアントに Redirect が永久的なもの (ステータス 301) であることを知らせます。 Redirect permanent とまったく同じです。
この場合「RedirectPermanent」 としてステータスの指定は301固定で変更できませんが、
特にステータスの変更が今後もないようであればこの記述でもいいかもしれません。
実際にRedirectPermanentディレクティブを利用して、
転送を行っているサンプルURLは以下です。
このディレクトリへ配置している.htaccessファイルは以下のようになっています。
これによって、 http://fc2.freeblg.info/transfer/ht_redirectpermanent/ に対して、
アクセスがあった場合は、 http://fc2.freeblg.info/transfer/ へ、
Permanent(301)転送が行われます。
エラーが発生しました。後でもう一度やり直してください。 |
curl -i -L http://fc2.freeblg.info/transfer/ht_redirectpermanent/
cURLによってアクセスを行った際のヘッダ情報は以下のようになります。
エラーが発生しました。後でもう一度やり直してください。 |
上段の301(Moved Permanently)として転送され、
転送先では200(OK)を正常に受け取っています。
RedirectTemp によるURL転送(一時)
こちらも上記のRedirect temp と混在してこの表記がされている場合もありますが、
基本的には全く同じものとされています。
mod_alias – Apache HTTP サーバ バージョン 2.2|RedirectTempディレクティブ
RedirectTempディレクティブ
説明: クライアントが違う URL を取得するように外部への一時的な リダイレクトを送る 構文: RedirectTemp URL-path URL コンテキスト: サーバ設定ファイル, バーチャルホスト, ディレクトリ, .htaccess 上書き: FileInfo ステータス: Base モジュール: mod_alias このディレクティブはクライアントに Redirect が一時的なものである (ステータス 302) ことを知らせます。 Redirect temp とまったく同じです。
この場合も「RedirectTemp」 としてステータスの指定は302固定で変更できませんが、
特にステータスの変更が今後もない場合や、
すぐに削除する予定がある場合などにはいいかもしれません。
実際にRedirectTempディレクティブを利用して、
転送を行っているサンプルURLは以下です。
このディレクトリへ配置している.htaccessファイルは以下のようになっています。
これによって、 http://fc2.freeblg.info/transfer/ht_redirecttemp/ に対して、
アクセスがあった場合は、 http://fc2.freeblg.info/transfer/ へ、
Temp(302)転送が行われます。
エラーが発生しました。後でもう一度やり直してください。 |
curl -i -L http://fc2.freeblg.info/transfer/ht_redirecttemp/
cURLによってアクセスを行った際のヘッダ情報は以下のようになります。
エラーが発生しました。後でもう一度やり直してください。 |
上段の302(Found)として転送され、転送先では200(OK)を正常に受け取っています。
Redirect MatchによるURL転送
これまでのURL転送の場合には、
要求のあったパスに一致する場合に、単純に別URLへと転送を行う動作でした。
そうした固定的なURL指定ではなく、
正規表現を用いて1行で多くのURL形式のURL転送を行うことができるのが、
このRedirect Matchディレクティブです。
mod_alias – Apache HTTP サーバ バージョン 2.2|Redirect Matchディレクティブ
RedirectMatchディレクティブ
説明: 現在の URL への正規表現のマッチにより 外部へのリダイレクトを送る 構文: RedirectMatch [status] regex URL コンテキスト: サーバ設定ファイル, バーチャルホスト, ディレクトリ, .htaccess 上書き: FileInfo ステータス: Base モジュール: mod_alias このディレクティブは Redirect とほとんど同じですが、簡単な先頭からのマッチを行なうのではなく、 正規表現を利用します。 ここで指定された正規表現と URL-path が合うかどうかを調べ、合う場合は括弧で括られたマッチを 与えられた文字列で置き換え、それをファイル名として使用します。 たとえば、すべての GIF ファイルを別サーバの同様な名前の JPEG ファイルにリダイレクトするには、以下のようなものを使います:
例
RedirectMatch (.*)\.gif$ http://www.anotherserver.com$1.jpg
この場合は似たようなURL形式を1つの正規表現で表して効率的に転送を行うことができます。
サンプルに記載されている転送の例を図示すると、
以下のような意味になっています。
http://www.anotherserver.com/image.gif へのアクセスがあった場合、
サーバーへの要求パスは「/image.gif 」になり、
http://www.anotherserver.com/image.jpg へのURL置換が行われます。
正規表現部分の各記号の意味は以下のように解釈され、
URLの置換が行われています。
は正規表現で、任意の1文字を表しています。
は複数回の繰り返しを表しています。
はエスケープ記号として記載されています。
直後の特殊記号「.(任意の1文字の意味)」を本来の記号(ドット)として表すことを示し、これによって「.gif」という文字列を意味しています。
は要求パスの最後を意味します。「.gifとしてURLが終了している」ことを条件としています。
こうした条件指定によって、
要求された「/image.gif」は置換条件に一致していることになります。
条件に一致している為、後に記載された置換条件が実行されます。
転送先URL部には「$1」という記号が含まれていますが、
これは条件部の「()内」を示しています。
はカッコ内の値(パス)を、転送先URL部の「$1」部分に代入する為の変数化をしている部分です。
.gifより前の部分「/image」部分が()内部分になり、置換部分の「$1」に挿入されます。
よって置換後のURLは以下のようになります。
http://www.anotherserver.com/image.jpg
これは単純に.gifファイルへの要求をすべてパス・ファイル名の変更なく、
そのまま.jpgファイルへの要求として置き換えるものです。
恒久転送(permanent)
Redirect Matchディレクティブを利用して恒久的なURL転送を行う場合には、
[status] 部分に対して、レスポンスコードを指定します。
恒久的な転送を行う場合には、301を指定します。
※これまでの数値と同じです。
他のディレクティブと異なっているのは正規表現を利用したマッチングが行える点です。
実際にRedirect Matchディレクティブを利用して、
転送を行っているサンプルURLは以下です。
以下では正規表現のメリットを利用していませんが、単純一致でも利用できる例です。
このディレクトリへ配置している.htaccessファイルは以下のようになっています。
これによって、 http://fc2.freeblg.info/transfer/ht_redirectmatch301/ に対して、
アクセスがあった場合は、 http://fc2.freeblg.info/transfer/ へ、
Permanent(301)転送が行われます。
エラーが発生しました。後でもう一度やり直してください。 |
curl -i -L http://fc2.freeblg.info/transfer/ht_redirectmatch301/
cURLによってアクセスを行った際のヘッダ情報は以下のようになります。
エラーが発生しました。後でもう一度やり直してください。 |
上段の301(Moved Permanently)として転送され、
転送先では200(OK)を正常に受け取っています。
一時転送(temp)
Redirect Matchディレクティブを利用して恒久的なURL転送を行う場合には、
[status] 部分に対して、レスポンスコードを指定します。
一時的な転送を行う場合には、302を指定します。
※これまでの数値と同じです。
実際にRedirect Matchディレクティブを利用して、
転送を行っているサンプルURLは以下です。
以下では正規表現のメリットを利用していませんが、単純一致でも利用できる例です。
このディレクトリへ配置している.htaccessファイルは以下のようになっています。
これによって、 http://fc2.freeblg.info/transfer/ht_redirectmatch302/ に対して、
アクセスがあった場合は、 http://fc2.freeblg.info/transfer/ へ、
Temp(302)転送が行われます。
エラーが発生しました。後でもう一度やり直してください。 |
curl -i -L http://fc2.freeblg.info/transfer/ht_redirectmatch302/
cURLによってアクセスを行った際のヘッダ情報は以下のようになります。
エラーが発生しました。後でもう一度やり直してください。 |
上段の302(Found)として転送され、転送先では200(OK)を正常に受け取っています。
その他のURL転送記述例
上記の転送例ではRedirect Matchディレクティブによる置換メリットを
ほとんど利用していません。
http://fc2.freeblg.info/transfer/ht_redirectmatch301/では、
要求されたURL(パス)「/transfer/ht_redirectmatch301/」が、
「^(最初)」から「$(最後)」までの間で完全一致している場合に転送を行っているだけです。
単純にURLの転送を行う場合には、これでも十分ではあるのですが、
実際には複雑なURL転送を行いたいものでしょう。
今回はFC2ブログ形式のURL転送を例に本投稿を作成していますので、
以下ではRedirect Matchディレクティブを利用した、
FC2ブログからのURL転送例をご紹介しています。
【作成中】
mod_rewriteによるURL転送
mod_rewiteを利用したURL転送は複雑な条件指定を行って、
URL転送の可否などが指定できる転送方法です。
例えば、特定のIPの場合のみURL転送を行いたいような場合や、
特定のブラウザのアクセスを振り分けたいような場合に有効です。
ただ、利用できる機能が多いため、
ヘルプによる抜粋で簡単にご説明ができないのが悩ましいところです。
mod_rewrite – Apache HTTP Server Version 2.2 (公式)
これまでのURL転送のパターンをmod_rewiteを利用して転送を行っている例は、
以下でご紹介しています。
恒久転送(permanent)
mod_rewiteを利用した恒久転送では、
RewriteRuleディレクティブのURL転送マッチングに対して、[R=301]として、
ステータスコード(301)を指定します。
なおLについては、この条件にマッチしたら以後のマッチングを行わないことを意味しています。
mod_rewrite – Apache HTTP Server Version 2.2|RewriteRule Directive
Flag and syntax Function last|L Stop the rewriting process immediately and don’t apply any more rules. Especially note caveats for per-directory and .htaccess context (see also the END flag). details …(適当訳)すぐに書き換え処理を停止し、それ以上のルールを適用されません。特にディレクトリごとの記載と.htaccessコンテキストに注意してください(ENDフラグも参照のこと) redirect|R[=code] Forces an external redirect, optionally with the specified HTTP status code. details …
実際にmod_rewiteを利用して転送を行っているサンプルURLは以下です。
以下ではmod_rewiteメリットをあまり利用していませんがあくまでも例です。
このディレクトリへ配置している.htaccessファイルは以下のようになっています。
これによって、 http://fc2.freeblg.info/transfer/ht_mod_rewrite301/ に対して、
アクセスがあった場合は、 http://fc2.freeblg.info/transfer/ へ、
Permanent(301)転送が行われます。
エラーが発生しました。後でもう一度やり直してください。 |
curl -i -L http://fc2.freeblg.info/transfer/ht_mod_rewrite301/
cURLによってアクセスを行った際のヘッダ情報は以下のようになります。
エラーが発生しました。後でもう一度やり直してください。 |
上段の301(Moved Permanently)として転送され、
転送先では200(OK)を正常に受け取っています。
一時転送(temp)
mod_rewiteを利用した恒久転送では、
RewriteRuleディレクティブのURL転送マッチングに対して、[R=302]として、
ステータスコード(302)を指定します。
実際にmod_rewiteを利用して転送を行っているサンプルURLは以下です。
以下ではmod_rewiteメリットをあまり利用していませんがあくまでも例です。
このディレクトリへ配置している.htaccessファイルは以下のようになっています。
これによって、 http://fc2.freeblg.info/transfer/ht_mod_rewrite302/ に対して、
アクセスがあった場合は、 http://fc2.freeblg.info/transfer/ へ、
Temp(302)転送が行われます。
エラーが発生しました。後でもう一度やり直してください。 |
curl -i -L http://fc2.freeblg.info/transfer/ht_mod_rewrite302/
cURLによってアクセスを行った際のヘッダ情報は以下のようになります。
エラーが発生しました。後でもう一度やり直してください。 |
上段の302(Found)として転送され、転送先では200(OK)を正常に受け取っています。
さいごに
URL転送に関してはいろいろな方法・アプローチが利用できるため、
実際に転送を行わなければならなくなった場合に、
どの方法を採用すればいいのかが迷うところです。
そして、実際に目的で検索した際には、
人それぞれにmod_rewiteで記述している例だったり、Redirect Matchだったりして、
余計に混乱してしまう場合もあります。
様々な方法があるだけに、自分に合った転送方法を採用したいものです。
補足
なお、URLの転送(ステータスコード:3xx)は仕様的には5回までは許容されるとされています。
極力、リダイレクトの回数は減らすべきではありますが、
適切にURL転送を行うことは既存のコンテンツを有効に活かすことができます。
参考
Robots.txt Specifications – Webmasters — Google Developers|Handling HTTP result codes
3xx (redirection)
Redirects will generally be followed until a valid result can be found (or a loop is recognized). We will follow a limited number of redirect hops (RFC 1945 for HTTP/1.0 allows up to 5 hops) and then stop and treat it as a 404. Handling of robots.txt redirects to disallowed URLs is undefined and discouraged. Handling of logical redirects for the robots.txt file based on HTML content that returns 2xx (frames, JavaScript, or meta refresh-type redirects) is undefined and discouraged.
Googlebotが一度に処理するリダイレクトの回数 | SEOモード
Apache,Apache Hadoop,Apache Subversion,Hadoop,HDFS,HBase,Hive,Mahout,Pigは、
Apache Software Foundationの米国およびその他の国における登録商標または商標です。
ApacheソフトウェアはApache Software License (原文)および
Apache License, 2.0 (原文)に基づきOpen Source Initiativeに承認されライセンスされています。
公開日:
最終更新日:2014/12/13