次のようなルートを使用できます。
routes.MapRoute("", "{*link}",
new { action = "oldlink", controller = "home" });
これにより、すべてのリクエストが次のコントローラーとアクション メソッドに送信されます。
public class HomeController : Controller
{
public ActionResult OldLink(string link)
{
//implement method...
return View((object)link);
}
}
アスタリスクは、そのセグメントが「キャッチオール」セグメントと呼ばれるものであることを示します。これにより、任意の長さの URL を単一のルートに一致させることができます。このルートでは、ホスト名の後の URL 内のすべてのセグメントが「リンク」文字列変数に割り当てられます。
たとえば、次の URL を入力するとします。
http://localhost/foo/bar/file.html
これは OldLink メソッドにルーティングされ、「リンク」文字列変数には値が含まれます
"foo/bar/file.html"
このルートについて注意すべき点がいくつかあります。
このルートの URL パターンは、すべての受信 URL に一致します。したがって、アプリケーション内のすべての URL は、"home" コントローラーの "oldlink" アクションにルーティングされます。このルートでは、URL を取得して他のルートに移動することはできません。
デフォルトでは、ASP.Net ルーティング エンジンは最初に、URL に一致する物理ファイルがディスク上に存在するかどうかを確認します。このように、css や JavaScript ファイルなどの静的ファイルに対するルーティング システムのルーティング リクエストについて心配する必要はありません。つまり、ディスク上のファイルと一致する URL がアプリに送信された場合、それは "home" コントローラーの "oldlink" アクションにルーティングされません。この既定の動作を変更し、静的ファイルの要求を含むすべてをルーティング エンジンにルーティングさせる場合は、global.asax ファイルの "RegisterRoutes" メソッドに次の行を追加する必要があります。
routes.RouteExistingFiles = true;
URL セグメントのキャッチオール ルート セグメントの詳細については、ルーティングに関するこの優れた MSDN 記事の「URL パターン内の可変数のセグメントの処理」というタイトルのセクションを参照してください。RouteExistingFiles プロパティの詳細については、こちらを参照してください。