2

入力/覚えやすいいくつかの「短い URL」を (紙のカタログのように) 公開したいが、それらを冗長で SEO に適した URL にリダイレクトしたいとします。MVC ルートでそれを達成するにはどうすればよいですか?

例:

http://mysite.com/disney

になる

http://mysite.com/travel/planning-your-disney-vacation (コントローラーは「travel」)

私が試したこと:

  1. ルートを設定するだけです。問題: URL がブラウザーで変更されません (「/disney」のままです。

  2. NuGet パッケージの RouteMagic を使用します ( Haacked の記事を参照)。 問題:エラーが表示されます: RouteData には、空でない文字列値を持つ「コントローラー」という名前の項目が含まれている必要があります。これは、コントローラーの前に静的な単語がないためだと思います (「travel」) 彼がしたように (「foo」と「bar」で)???

  3. ( Ian Mercer のような) リダイレクト モジュールを使用します。問題:不要な URL を作成すると、HTML.ActionLinks でルートが一致します (Haacked は記事でこれについて言及し、それが GetVirtualPath が NULL を返す理由だと言っています ...?)

私はアイデアが不足しているので、何でもいただければ幸いです!ありがとう!

4

3 に答える 3

3

キャッチオール タイプのルートを設定して、すべての /something リクエストを特定のアクションとコントローラーに転送できます。たとえば、次のようになります。

routes.MapRoute(
    "ShortUrls",
    "{name}",
    new {controller = "ShortUrl", action = "Index", name = UrlParameter.Optional}
);

(残りのルーティングがどのように設定されているかによっては、深刻なルーティングの頭痛の種になる可能性があるため、このように正確に実行したくない場合がありますが、単純にするためにここで機能します)

次に、指定された値に基づいて、アクションを目的の URL にリダイレクトします。

public class ShortUrlController : Controller
{
    //
    // GET: /ShortUrl/

    public ActionResult Index(string name)
    {
        var urls = new Dictionary<string, string>();
        urls.Add("disney", "http://mysite.com/travel/planning-your-disney-vacation");
        urls.Add("scuba", "http://mysite.com/travel/planning-your-scuba-vacation");

        return Redirect(urls[name]);
    }
}
于 2012-03-01T06:26:54.613 に答える
1

私はちょうど同じ問題に直面しました。私のグローバルでは:

routes.MapRoute(
    "ShortUrls",
    "{name}",
    new { controller = "Home", action = "Index", name = UrlParameter.Optional }
);

私のホームコントローラーで:

public ActionResult Index(string name)
{
    return View(name);
}

この方法は動的で、新しいページを追加する必要があるたびに再コンパイルする必要はありませんでした。

于 2012-08-17T11:37:31.093 に答える
0

URL を短縮するには、URL 書き換え技術を使用する必要があります。

件名に関するいくつかのチュートリアル:

于 2012-03-01T05:35:40.887 に答える