{"id":187,"date":"2009-09-06T23:20:23","date_gmt":"2009-09-06T21:20:23","guid":{"rendered":"http:\/\/unckel.com\/blog\/?p=187"},"modified":"2019-12-07T22:10:34","modified_gmt":"2019-12-07T21:10:34","slug":"asp-net-canonical-link-tag-dynamisch-anpassen-und-einfuegen","status":"publish","type":"post","link":"https:\/\/unckel.de\/blog\/asp-net-canonical-link-tag-dynamisch-anpassen-und-einfuegen\/","title":{"rendered":"ASP.NET: Canonical-Link-Tag dynamisch anpassen und einf\u00fcgen"},"content":{"rendered":"<p>Doppelte Inhalte m\u00f6gen Suchmaschinen bekannterma\u00dfen nicht. Doch meistens k\u00f6nnen Webseiten \u00fcber\u00a0<strong>http:\/\/domain.de<\/strong>\u00a0und\u00a0<strong>http:\/\/www.domain.de<\/strong>\u00a0erreicht werden. F\u00fcr die Suchmaschine sind das zwei unterschiedliche Dinge.<\/p>\n<p>Ein recht einfacher Ansatz mit ASP.NET kann so aussehen:<\/p>\n<pre>\/\/ using System.Web.UI.HtmlControls;\n\nHtmlLink canonicalLink = new HtmlLink();\ncanonicalLink.Attributes[\"rel\"] = \"canonical\";\ncanonicalLink.Href = Request.Url.AbsoluteUri.Replace(\"www.\", \"\");\nPage.Header.Controls.Add(canonicalLink);<\/pre>\n<p>Das ganze kommt dann z.B. in den Event-Handler Page_Load (Master-Datei, Basisklasse, &#8230;). Es wird dann im HTML-Head der Seite das entsprechende Tag erzeugt:<br \/>\n<strong>&lt;link rel=&#8220;canonical&#8220; href=&#8220;http:\/\/domain.de\/site.aspx&#8220; \/&gt;<\/strong><\/p>\n<p>\u00dcber\u00a0<strong>Request.Url.AbsoluteUri<\/strong>\u00a0wird die aktuelle URL samt Host und Parametern ermittelt und per\u00a0<strong>Replace(&#8222;www.&#8220;, &#8222;&#8220;)<\/strong>\u00a0einfach, sofern vorhanden, das &#8222;www.&#8220; entfernt. Aber Vorsicht: Alle Fundstellen mit &#8222;www.&#8220; werden entfernt! Also auch etwaige \u00fcbergebenen Parameter &gt; d.h bei Bedarf nachbessern.<\/p>\n<p>Alternativ kann aber auch per 301-Redirect in der global.asax umgeleitet werden.<br \/>\nDas k\u00f6nnte dann wie folgt aussehen:<\/p>\n<pre>&lt;%@ Application Language=\"C#\" %&gt;\n&lt;script runat=\"server\"&gt;\nvoid Application_BeginRequest(object sender, EventArgs e)\n{\n  string url = HttpContext.Current.Request.Url.ToString().ToLower();\n  \n  if (!url.StartsWith(\"http:\/\/domain.de\"))\n  {\n    \/\/ alle auf .de leiten\n    url = url.Replace(\"domain.net\", \"domain.de\");\n    url = url.Replace(\"domain.com\", \"domain.de\");\n  \n    \/\/ \"www.\" entfernen\n    url = url.Replace(\"http:\/\/www.domain\", \"http:\/\/domain\");\n\n    \/\/ permanente (301) Umleitung\n    HttpContext.Current.Response.Status = \"301 Moved Permanently\";\n    HttpContext.Current.Response.AddHeader(\"Location\", url);\n  }\n}\n&lt;\/script&gt;<\/pre>\n<p>Hier wird jeden Anfrage gepr\u00fcft und ggf. auf die bevorzugte Domain per 301 umgeleitet &#8211; sprich das &#8222;www.&#8220; einfach entfernt.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Doppelte Inhalte m\u00f6gen Suchmaschinen bekannterma\u00dfen nicht. Doch meistens k\u00f6nnen Webseiten \u00fcber\u00a0http:\/\/domain.de\u00a0und\u00a0http:\/\/www.domain.de\u00a0erreicht werden. F\u00fcr die Suchmaschine sind das zwei unterschiedliche Dinge. Ein recht einfacher Ansatz mit ASP.NET kann so aussehen: \/\/ using System.Web.UI.HtmlControls; HtmlLink canonicalLink = new HtmlLink(); canonicalLink.Attributes[&#8222;rel&#8220;] = &#8222;canonical&#8220;; canonicalLink.Href = Request.Url.AbsoluteUri.Replace(&#8222;www.&#8220;, &#8222;&#8220;); Page.Header.Controls.Add(canonicalLink); Das ganze kommt dann z.B. in den Event-Handler Page_Load (Master-Datei, [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[71],"tags":[],"class_list":["post-187","post","type-post","status-publish","format-standard","hentry","category-webdesign"],"_links":{"self":[{"href":"https:\/\/unckel.de\/blog\/wp-json\/wp\/v2\/posts\/187","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/unckel.de\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/unckel.de\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/unckel.de\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/unckel.de\/blog\/wp-json\/wp\/v2\/comments?post=187"}],"version-history":[{"count":1,"href":"https:\/\/unckel.de\/blog\/wp-json\/wp\/v2\/posts\/187\/revisions"}],"predecessor-version":[{"id":802,"href":"https:\/\/unckel.de\/blog\/wp-json\/wp\/v2\/posts\/187\/revisions\/802"}],"wp:attachment":[{"href":"https:\/\/unckel.de\/blog\/wp-json\/wp\/v2\/media?parent=187"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/unckel.de\/blog\/wp-json\/wp\/v2\/categories?post=187"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/unckel.de\/blog\/wp-json\/wp\/v2\/tags?post=187"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}