Misc. Notes

[インデックスに戻る]

リダイレクション

あるURLにアクセスしたときに、別のURLを参照するようにブラウザ(useragent)に指示することができます。一般的にブザウザはこのレスポンスを受けると自動的に転送先を参照し直します。

これによって移転時やウェブサイト改装時のURLの変更の際の害を軽減できます。

※転送前と転送先と両方に1回アクセスすることになるので、同じコンテンツのURLが変わったときの対処や一時的な(間に合わせの)処置に限ったほうがいいかもしれません。

目次


移転したサイト

リンクを辿ったらウェブサイトが移転していたなんてことは結構あると思いますが、大抵そのようなサイトはトップページの<head>内に、

<meta http-equiv="refresh" content="10;url=移転先">

と書いて、本文に「10秒後に自動的に移動します。しない場合は…」と書いていたりします。

アクセスした時にサイトが別の場所に移転したことがはっきりと分かり、見る側がそれなりの処置(ブックマークやリンクの変更)ができます。よって暫く後に移転元を消さなければいけない場合はこの方法がいいかもしれません。

しかしトップだけならそれもいいですが、もしサイトの別の場所にブックマークしていたり、リンクを貼っている人がいたら? サーチエンジンの検索結果から来た場合はよくあることであり、全部のページについて上記の様なものを作成しておかないと、その人たちは迷子になってしまいます。

もっとも、そのURLは見つかりません(404 File Not Found)と出たら、親ディレクトリにアクセスしてみたりするかもしれません。しかし、それ以上見ようとはしない人もいるでしょう(コンテンツ次第ですね ^^;)。そこでリダイレクション(Redirection)という仕組みを使います。


Redirect URLパス 転送先URL (Apache 1.1以降)
Redirect [ステータス] URLパス 転送先URL (Apache 1.2以降)
RedirectTemp URLパス 転送先URL (Apache 1.2以降)
RedirectPermanent URLパス 転送先URL (Apache 1.2以降)

これで転送先を参照するようにブラウザに応答が返ります。URLパスは常にトップ(/)からのパスを記述します。このパスに?やそれ以降のqueryは含められません。また転送先URLは相対URLは記述できません。

statusを省略した場合はRedirect temp (=302 Moved Temporarily)やRedirectTempと同じになります。各statusについては後で簡単に述べます。

Redirect permanent /users/foo http://to.example/foo
    そのサーバの/users/foo以下へのアクセスはhttp://to.example/fooへ転送。
        例えば、ホストがfrom.exampleだったとしたら、
        http://from.example/users/foo/bar.htmlはhttp://to.example/foo/bar.htmlにリダイレクトされる。
 
Redirect / http://newserver.example/jp/

statusの種類

statusには3桁の数値(HTTPのステータスコード)を指定します。またstatusが3百番台(3xx)の場合のみ、転送先URLが必要です。

よく使われるstatusは文字列定数として用意されています。

permanent (301)
URLが変更になった場合。このレスポンスは通常キャッシュすることができるので、普通のRedirectにはこれがいいでしょう。RedirectPermanentと等価です。(301 Moved Permanently)
temp (302)
URLが一時的に変更になった場合。特に指定されない限り、このレスポンスはキャッシュされません。RedirectTempと等価です。(302 Found)
seeother (303)
URLが変更になった場合。但し転送先が元URLの代替ではない場合に使われます。古いブラウザではこのレスポンスは認識されないかも知れません。(303 See Other)
gone (410)

元のURLは既に存在しなくて、しかも転送先が見つからない場合。従って転送先URLは省略しなければなりません。通常このstatusを使う必要はありません。

ブラウザにはそのURLは存在しないし転送先も無いので全ての参照を削除するようにという(サーバから送られた)メッセージが表示されます。(410 Gone)

404 (おまけ)
普通わざわざこれを指定する必要はないですが、使うことでファイルを消さずにNot Foundを返すことができます (^^; 転送先URLは省略します。(404 Not Found)

特定のパターンで転送する

例えば画像は別サーバに置きたくなったとか、画像は今までHTMLと同じディレクトリに分散させていたけどまとめて/images/に置きたくなった場合、GIFファイルは廃止してPNGにしようと思ったときなどに、画像を参照しているHTML全てを書き換えてアップロードするのは面倒です。(サーバ上で作業できるならば直接一括置換すれば解決できますが)

リダイレクションを使えばHTMLソースの修正は後回しにして、別の場所を参照させることが簡単にできます。

RedirectMatch [ステータス] 正規表現 転送先URL (Apache 1.3以降)

正規表現は前方から最長一致でチェックされるようです。転送が循環しないように注意して下さい。statusについては上の方に書いてあります。

RedirectMatch (.+(jpg|gif|png))$ http://storage.example$1
    (転送先とは異なる)あるサーバの画像へのアクセスは「http://storage.example/パス」へ転送。
 
RedirectMatch /([^/]+(sit|lzh|zip|tar|tgz|bin|hqx))$ http://myserver.example/archives/$2
    (転送先とは異なる)あるサーバのアーカイブへのアクセスは全て「http://myserver.example/archives/ファイル名」へ転送。
 
RedirectMatch permanent (.+)\.gif$ http://myserver.example$1.png
    GIFファイルはPNGに変換したので、GIFは全てPNGを参照させる。
 
RedirectMatch permanent (.+)\.htm$ http://myserver.example$1.html
    HTMLの拡張子を変えた。
 
RedirectMatch .+/.+/([^/]+\.(jpg|gif|png))$ (.+)\.gif$ http://myserver.example/images/$1.png
    「サブディレクトリ/images/画像ファイル」は全て「images/画像ファイル」を参照させる。
[インデックスに戻る]

Copyright © 1999-2005 Kentaro Sato. All rights reserved.