24

編集:今、私はこの問題を実際に解決する必要があります.もう少し調査を行い、重複したコンテンツを減らすためにいくつかのことを考え出しました. 詳細なコード サンプルをブログに投稿しました: ASP.NET MVC による重複コンテンツの削減

最初の投稿 - これを間違ってマークしたり、ひどくタグ付けしたりした場合は、簡単に行ってください:P

Microsoft の新しい ASP.NET MVC フレームワークでは、コンテンツが複数の URL で提供される可能性がある原因が 2 つあります (Google がペナルティを科し、PageRank がそれらに分割される原因となるもの):

  • 大文字と小文字を区別しない URL
  • デフォルトの URL

ドメインのルートへのリクエストを処理するデフォルトのコントローラー/アクションを設定できます。HomeController/Index を選択するとします。最終的に、同じコンテンツを提供する次の URL になります。

  • mydomain.com/
  • mydomain.com/Home/Index

人々がこれらの両方にリンクし始めると、PageRank が分割されます。また、Google はコンテンツの重複を考慮し、結果の重複を避けるためにそのうちの 1 つにペナルティを課します。

さらに、URL では大文字と小文字が区別されないため、実際にはこれらの URL でも同じコンテンツが取得されます。

  • mydomain.com/Home/Index
  • mydomain.com/home/index
  • mydomain.com/Home/index
  • mydomain.com/home/Index
  • (リストは続きます)

では、質問です...どうすればこれらのペナルティを回避できますか? をお願いします:

  • デフォルト アクションのすべてのリクエストが同じ URL にリダイレクトされる(301 ステータス)
  • すべての URL で大文字と小文字が区別される

可能?

4

7 に答える 7

11

私もこれに取り組んでいました。これについては、明らかにScottGuに任せます。ただし、この問題に対する解決策も謙虚に提供します。

次のコードをglobal.asaxに追加します。

protected void Application_BeginRequest(Object sender, EventArgs e)
{
    // If upper case letters are found in the URL, redirect to lower case URL.
    if (Regex.IsMatch(HttpContext.Current.Request.Url.ToString(), @"[A-Z]") == true)
    {
        string LowercaseURL = HttpContext.Current.Request.Url.ToString().ToLower();

        Response.Clear();
        Response.Status = "301 Moved Permanently";
        Response.AddHeader("Location",LowercaseURL);
        Response.End();
    }
}

素晴らしい質問です。

于 2008-10-04T20:57:29.117 に答える
9

ここに投稿するだけでなく、ScottGu にメールを送信して、彼の反応が良いかどうかを確認しました。彼は、ルートに制約を追加するためのサンプルを提供したので、小文字の URL にしか応答できませんでした:

public class LowercaseConstraint : IRouteConstraint
{
    public bool Match(HttpContextBase httpContext, Route route,
            string parameterName, RouteValueDictionary values,
            RouteDirection routeDirection)
    {
        string value = (string)values[parameterName];

        return Equals(value, value.ToLower());
    }

そして register routes メソッドでは:

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(
        "Default",                                              // Route name
        "{controller}/{action}/{id}",                           // URL with parameters
        new { controller = "home", action = "index", id = "" },
        new { controller = new LowercaseConstraint(), action = new LowercaseConstraint() }
    );
}

スタートですが、Html.ActionLink や RedirectToAction などのメソッドからリンクの生成を変更できるようにしたいと考えています。

于 2008-10-04T20:35:44.153 に答える
3

バンプ!

MVC 5では、小文字の URL と一般的な末尾のスラッシュ ポリシーのみの生成がサポートされるようになりました。

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.LowercaseUrls = true;
        routes.AppendTrailingSlash = false;
     }

また、異なるドメイン/IP/レターケーシングなどで重複するコンテンツを避けるために、私のアプリケーションでも...

http://yourdomain.com/en

https://yourClientIdAt.YourHostingPacket.com/

PrimaryDomain - Protocol - Controller - Language - Actionに基づいて Canonical URL を生成する傾向があります。

public static String GetCanonicalUrl(RouteData route,String host,string protocol)
{
    //These rely on the convention that all your links will be lowercase! 
    string actionName = route.Values["action"].ToString().ToLower();
    string controllerName = route.Values["controller"].ToString().ToLower();
    //If your app is multilanguage and your route contains a language parameter then lowercase it also to prevent EN/en/ etc....
    //string language = route.Values["language"].ToString().ToLower();
    return String.Format("{0}://{1}/{2}/{3}/{4}", protocol, host, language, controllerName, actionName);
}

次に、@ Gabe Sumner の回答を使用して、現在のリクエスト URL が一致しない場合にアクションの正規 URL にリダイレクトできます。

于 2016-12-22T09:16:22.333 に答える
2

これにはもっと良い答えがあると思います。次のように、ページ ヘッドに canonical リンクを配置した場合:

<link rel="canonical" href="http://mydomain.com/Home/Index"/>

その後、Google は結果に正規ページのみを表示し、さらに重要なことに、すべての Google の利点がペナルティなしでそのページに適用されます。

于 2012-06-22T20:31:40.457 に答える
1

あなたと同じように、私も同じ質問をしました。ただし、私はすべて小文字の URL 制限に甘んじることはしたくなかったし、このcanonicalアプローチも好きではありませんでした (まあ、それは良いことですが、それだけではありません)。

解決策が見つからなかったため、リダイレクト クラスを作成してオープンソース化しました。

使い方は簡単です。コントローラー クラスの各 GET メソッドは、最初に次の 1 行を追加するだけです。

Seo.SeoRedirect(this);

SEO 書き換えクラスは、C# 5.0 の Caller Info 属性を自動的に使用して面倒な作業を行い、上記のコードを厳密にコピー アンド ペーストします。

リンクされた SO Q&A で述べたように、これを属性に変換する方法に取り組んでいますが、今のところ、仕事は完了しています。

このコードは、URL に対して 1 つのケースを強制します。大文字と小文字は、コントローラーのメソッドの名前と同じになります。すべて大文字にするか、すべて小文字にするか、または両方を組み合わせるかを選択します (キャメルケースは URL に適しています)。大文字と小文字を区別しない一致に対して 301 リダイレクトを発行し、最高のパフォーマンスを得るために結果をメモリにキャッシュします。また、末尾のバックスラッシュをリダイレクトし (インデックス リストの場合は強制、それ以外の場合は強制オフ)、既定のメソッド名を介してアクセスされる重複したコンテンツを削除します (Indexストック ASP.NET MVC アプリ内)。

于 2012-11-06T06:55:40.873 に答える
0

8年後にあなたがどう感じるかは本当にわかりませんが、現在ASP MVC 5は属性ルーティングをサポートしており、ルートを覚えやすく、SEOフレンドリーなサイトの重複コンテンツの問題を解決しています.

routes.MapMvcAttributeRoutes(); を追加するだけです。RouteConfig で、次のような各アクションに対して唯一のルートを定義します

    [Route("~/")]
    public ActionResult Index(int? page)
    {
        var query = from p in db.Posts orderby p.post_date descending select p;
        var pageNumber = page ?? 1;
        ViewData["Posts"] = query.ToPagedList(pageNumber, 7);         
        return View();
    }
    [Route("about")]
    public ActionResult About()
    {
        return View();
    }
    [Route("contact")]
    public ActionResult Contact()
    {
        return View();
    }
    [Route("team")]
    public ActionResult Team()
    {
        return View();
    }
    [Route("services")]
    public ActionResult Services()
    {
        return View();
    }
于 2016-01-26T03:11:14.777 に答える