18

最新の MVC プレビューでは、レガシー URL に次のルートを使用しています。

routes.MapRoute(
"Legacy-Firefox", // Route name
"Firefox-Extension/", // URL with parameters
new { controller = "Home", action = "Firefox", id = "" } // Parameter defaults
);

問題は、次の URL の両方が機能することです: http://example.com/Firefox-Extension http://example.com/Firefox-Extension/

2番目だけを機能させたい(SEO用)。また、そのページへのリンクを作成すると、ルーティング エンジンは末尾のスラッシュのない URL を返します。

これは、リンクを生成するために使用しているコードです。

<%= Html.ActionLink("Firefox Extension", "Firefox", "Home")%>

最初の問題は、HTTP ハンドラーを使用して URL への 301 リダイレクトを末尾のスラッシュで行うことで解決できると思います。ただし、末尾のスラッシュを使用して URL にリンクしたいので、スラッシュを使用してバージョンをハードコードする必要がないようにしたいと考えています。

ルートに末尾のスラッシュを強制的に使用する方法を知っている人はいますか?

4

7 に答える 7

3

私はこのブログ投稿に出くわしました:

http://www.ytechie.com/2008/10/aspnet-mvc-what-about-seo.html

今朝、StackOverflowでこの質問にぶつかる前に。そのブログ投稿(この質問の作成者から)には、この質問への回答を含む、ScottHanselmanからのこのブログ投稿へのトラックバックがあります。

http://www.hanselman.com/blog/ASPNETMVCAndTheNewIIS7RewriteModule.aspx

ここからそこへのリンクがまだ見つからないことに驚いたので、追加しました。:)

スコットの答えは、URL書き換えを使用することを示唆しています。

于 2010-05-06T13:00:20.667 に答える
3

RouteLink のラッパーがある場合は、問題の簡単な解決策があります。たとえば、RouteLinkEx というラッパー メソッドがありました。

public static string RouteLinkEx(this HtmlHelper helper,string text,string routeName,RouteValueDictionary rvd,object htmlAttributes)
      {

      UrlHelper uh = new UrlHelper(helper.ViewContext.RequestContext,helper.RouteCollection);
      // Add trailing slash to the url of the link
      string url = uh.RouteUrl(routeName,rvd) + "/";
      TagBuilder builder = new TagBuilder("a")
      {
        InnerHtml = !string.IsNullOrEmpty(text) ? HttpUtility.HtmlEncode(text) : string.Empty
      };
      builder.MergeAttributes(new RouteValueDictionary(htmlAttributes));
      builder.MergeAttribute("href",url);
      return builder.ToString(TagRenderMode.Normal);
      //---  
      }

ご覧のとおり、最初にパラメーターを使用して URL を生成しました。次に、URL の末尾に「/」を追加しました。そして、それらの URL を使用して完全なリンクを生成しました。

于 2009-06-05T12:38:56.973 に答える
2

リンクを書くときは、常に最後のスラッシュを含める必要があります。これがmvcフレームワーク(または一般的なURLルーティング)に当てはまるかどうかはわかりませんが、静的リソースの場合、スラッシュを入れないと、リクエストが2回行われるため、わずかなオーバーヘッドが追加されます。

スラッシュは、URLがディレクトリを指していることをすぐに識別します。ファイルを解析する必要はありません。

繰り返しになりますが、URLルーティングを使用する場合、これが当てはまるとは思いませんが、調査していません。

末尾のスラッシュに関する記事については、こちらを確認してください

編集:これについて考えると...スラッシュを含めようとするよりも、スラッシュを省略したほうがよいと思います。URLルーティングを使用している場合は、URLを使用してリソースに直接ルーティングしています。index.htmlまたはdefault.aspxでディレクトリを指すのではなく、特定のファイルを指します。

違いは微妙ですが、フレームワークと戦うよりも、RoutedUrlsの非スラッシュに固執する方が良いかもしれません。

実際にディレクトリを指している場合は、末尾のスラッシュを厳密に使用してください。本当に気に入らなければ、毎回最後にスラッシュを付けることができると思います。

于 2008-11-08T05:57:49.690 に答える
1

ここで RouteLinkEx(HtmlHelper, string,string, object) のオーバーロード

        public static string RouteLinkEx(this HtmlHelper helper, string text, string routeName, object routeValues)
    {

        UrlHelper uh = new UrlHelper(helper.ViewContext.RequestContext);

        // Add trailing slash to the url of the link 
        string url = uh.RouteUrl(routeName, routeValues) + "/";
        TagBuilder builder = new TagBuilder("a")
        {
            InnerHtml = !string.IsNullOrEmpty(text) ? HttpUtility.HtmlEncode(text) : string.Empty
        };
        //builder.MergeAttributes(new RouteValueDictionary(htmlAttributes));
        builder.MergeAttribute("href", url);
        return builder.ToString(TagRenderMode.Normal);
        //---   
    }
于 2010-02-01T04:13:16.850 に答える
1

ASP.NET MVC 2 の私のバージョンは次のとおりです。

    public static MvcHtmlString RouteLinkEx(this HtmlHelper helper, string text, RouteValueDictionary routeValues)
    {
        return RouteLinkEx(helper, text, null, routeValues, null);
    }

    public static MvcHtmlString RouteLinkEx(this HtmlHelper htmlHelper, string text, string routeName, RouteValueDictionary routeValues, object htmlAttributes)
    {
        string url = UrlHelper.GenerateUrl(routeName, null, null, null, null, null, routeValues, htmlHelper.RouteCollection, htmlHelper.ViewContext.RequestContext, false);

        var builder = new TagBuilder("a")
        {
            InnerHtml = !string.IsNullOrEmpty(text) ? HttpUtility.HtmlEncode(text) : string.Empty
        };
        builder.MergeAttributes(new RouteValueDictionary(htmlAttributes));
        // Add trailing slash to the url of the link
        builder.MergeAttribute("href", url + "/");
        return MvcHtmlString.Create(builder.ToString(TagRenderMode.Normal));
    }
于 2010-08-23T05:25:28.173 に答える
1

あなたは間違った角度から問題を解決していると思います。単一の URL を強制する理由は、SEO のためです。これは、検索エンジンがこの 2 つの URL を同じコンテンツと見なすため、重複コンテンツのペナルティを受けることを意味していると思います。

この問題の別の解決策は、ページの「公式」URL を検索エンジンに伝える CANONICAL タグをページに追加することです。これを行うと、URL を強制する必要がなくなり、検索エンジンからペナルティを受けることもなく、検索結果が公式 URL にルーティングされます。

https://support.google.com/webmasters/answer/139066?hl=ja

于 2015-02-08T15:00:49.623 に答える