クライアントが新しいURLを取得するように、リダイレクトを指示できます。
Redirect [status] URL-path URLRedirect ディレクティブ - mod_alias - Apache HTTP サーバ
キーワード | 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
とした場合に一致するのは、
のようなURLだけであり、
には一致しません。
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 [status] regex URLRedirectMatch ディレクティブ - 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でも可能です。