Redirect (URL転送)

クライアントが新しいURLを取得するように、リダイレクトを指示できます。

構文

Redirect [status] URL-path URL
Redirect ディレクティブ - mod_alias - Apache HTTP サーバ
status引数
キーワード HTTPステータス 説明
permanent 301 永久に移動した
temp 302 一時的に移動した (既定値)
seeother 303 他のもので置き換えた
gone 410 永久に削除した

URL-pathはリダイレクトのURLで、スラッシュ ( / ) から始まる絶対パスで記述します。

URLはリダイレクトのURLで、スキーム名 (httpなど) から始まる絶対URLで記述します。またはApache 2.2.6以降ならば、URL-pathと同様にスラッシュから始まるパスの記述もサポートされます。その場合には、現在のスキーム名とホスト名を指定したものとみなされます。ただしサーバの設定によっては正常に処理されないことがあるので、絶対URLで記述すべきです。

リダイレクト元のURLは、パス区切りで完全に一致する必要があります。それを/aとした場合に一致するのは、

  • http://example.com/a
  • http://example.com/a/b

のようなURLだけであり、

  • http://example.com/ab
  • http://example.com/a.txt

には一致しません。

URLの書き換えをより柔軟に行うには、書き換え条件を正規表現で指定できるRedirectMatchを使用します。またはRewriteRuleフラグで「R」を指定することでも、正規表現による指定でリダイレクトできます。

記述例

Redirect permanent /xx/yy/ http://example.com/zz/

これは、

http://example.com/xx/yy/index.html (HTTP/1.1 301 Moved Permanently)
 ↓
http://example.com/zz/index.html

のようにリダイレクトされます。

リダイレクト先が、他のリダイレクト元に一致する場合

Redirect /a http://example.com/b
Redirect /b http://example.com/c

このようにリダイレクト先に指定されたURLが、他のディレクティブのリダイレクト元に一致する場合には、

http://example.com/a (HTTP/1.1 302 Found)
 ↓
http://example.com/b (HTTP/1.1 302 Found)
 ↓
http://example.com/c

のように、連続してリダイレクトが発生します。このときディレクティブの記述を、

Redirect /b http://example.com/c
Redirect /a http://example.com/b

のように順を入れ替えても、結果は同じです。

リダイレクト元が重複する場合

Redirect /a http://example.com/b
Redirect /a http://example.com/z
http://example.com/a (HTTP/1.1 302 Found)
 ↓
http://example.com/c

この場合には、最初に一致する条件で一度だけリダイレクトされます。よって、

Redirect /a http://example.com/z
Redirect /a http://example.com/b

のようにディレクティブの記述順を入れ替えると、

http://example.com/a (HTTP/1.1 302 Found)
 ↓
http://example.com/z

となり、結果は違うものになります。この問題は上位のパスが重複する場合に、より顕在化します。

Redirect /a   http://example.com/z
Redirect /a/b http://example.com/c
http://example.com/a/b
 ↓
http://example.com/z/b

このように意図しない結果を招きます。この問題は、記述の順に配慮することで防止できます。この場合には次のようにします。

Redirect /a/b http://example.com/c
Redirect /a   http://example.com/z

つまり、より下位のパスまで指定しているディレクティブを、先に記述すべきです。

RedirectMatch (正規表現による指定)

RedirectMatch [status] regex URL
RedirectMatch ディレクティブ - mod_alias - Apache HTTP サーバ バージョン 2.2

リダイレクトするURLを正規表現で指定できます。それ以外はRedirectと同じです。なおApacheの正規表現はPCREを用いており、これはPerl互換の正規表現ライブラリです。正規表現 - 用語 - Apache HTTP サーバ バージョン 2.2

たとえばスラッシュの連続を取り除くには、

RedirectMatch permanent ^(.*)//+(.*)$ http://example.com$1/$2

とします。また、拡張子の後のスラッシュを取り除くには、

RedirectMatch permanent ^(.*\.[a-z]+)/$ http://example.com$1

のようにします。このような書き換えはRewriteRuleでも可能です。