Friday, October 11, 2019

Episerver - Handle Canonical Links


   /// <summary>
        /// Handle Canonical
        /// </summary>
        public static string SetupCanonicalUrl(SitePageData currentPage, HttpContext cont)
        {
            if (currentPage == null) { return string.Empty; }

            var externalUrl = currentPage.PageLink.GetExternalUrl();

            //Is Simple URL: Check
            if (!string.IsNullOrEmpty(currentPage.ExternalURL) &&
                String.Compare(currentPage.ExternalURL, cont.Request.Url.Segments.Last().Replace("/", ""),
                    StringComparison.OrdinalIgnoreCase) == 0)
            {
                //If 404 page no canoncial otherwise canonical
                var baseType = currentPage.GetType().BaseType;
                if (baseType != null && (!string.IsNullOrEmpty(externalUrl) && baseType.Name != typeof(NotFoundPage).Name))
                {
                    return WriteCanonicalLink(externalUrl);
                }
            }

            else
            {
                //Set Canonical if SEO override is set.
                if (currentPage.SetUniqueCanoncial != null)
                {
                    return WriteCanonicalLink(currentPage.SetUniqueCanoncial);
                }

                //Ordinary Canonical
                return WriteCanonicalLink(externalUrl);
            }
            return string.Empty;
        }

        private static string WriteCanonicalLink(String externalUrl)
        {
            HtmlLink canonicalLink = new HtmlLink();
            canonicalLink.Attributes.Add("rel", "canonical");
            canonicalLink.Href = externalUrl.TrimAndLower();
            return canonicalLink.Href;
        }+

  public static string GetExternalUrl(this PageData pageData)
        {

            var urlString = UrlResolver.Current.GetUrl(pageData.ContentLink, ((ILocalizable)pageData).Language.Name, new VirtualPathArguments { ForceCanonical = true });
            if (string.IsNullOrEmpty(urlString))
            {
                return urlString;
            }

            var uri = new Uri(urlString, UriKind.RelativeOrAbsolute);
            if (uri.IsAbsoluteUri)
            {
                return urlString;
            }

            if (!uri.IsAbsoluteUri)
            {
                var siteDefResolver = ServiceLocator.Current.GetInstance<ISiteDefinitionResolver>();
                SiteDefinition siteDefinition = siteDefResolver.GetByContent(
                    contentLink: pageData.ContentLink,
                    fallbackToWildcard: true,
                    fallbackToEmpty: true);

                return new Uri(siteDefinition.SiteUrl, uri).ToString();
            }

            return urlString;
        }

No comments:

Post a Comment