BlogEngine - Extension for canonical tags

Now something different - as we use for our blog system we experienced issue that this Blog software does not add canonical tags which are needed for SEO.

Now, extension is not that complicated (btw. we use 3.3.6 version).

Search for file account.master and add there in <head> section:

 <link href="https://YOUR_URL/account/login.aspx" rel="canonical" />

As a second step go to BlogEngine.Core project and search for file BlogBasePage.cs (should be in \Web\Controls folder) and add following code (I put it after protected virtual void AddMetaContentType()):

      /// <summary>
        /// Adds the canonical tag to the header.
        /// </summary>
        protected virtual void AddCanonical()
            string rawUrl = String.Concat(this.GetApplicationUrl(), Request.RawUrl);
            //if (rawUrl.Contains("/post/"))
                //bool hasQueryStrings = Request.QueryString.Keys.Count > 1;
                //if (hasQueryStrings)
                    Uri uri = new Uri(rawUrl);
                    rawUrl = uri.GetLeftPart(UriPartial.Path);
                    HtmlLink canonical = new HtmlLink();
                    canonical.Href = rawUrl;
                    canonical.Attributes["rel"] = "canonical";
        private string GetApplicationUrl()
            string basePath;
            string port = HttpContext.Current.Request.ServerVariables["SERVER_PORT"];
            string protocol = HttpContext.Current.Request.ServerVariables["SERVER_PORT_SECURE"];
            string serverName = HttpContext.Current.Request.ServerVariables["SERVER_NAME"];
            if (port == null || port == "80")
                port = String.Empty;
                port = String.Concat(":", port);
            if (protocol == null || protocol == "0")
                protocol = "http://";
                protocol = "https://";
            basePath = String.Concat(protocol, serverName, port);
            return basePath;
In case that you want to add canonical tag only to post pages uncomment
if (rawUrl.Contains("/post/"))
and in case that you have QueryStrings you'll need to uncomment
bool hasQueryStrings = Request.QueryString.Keys.Count > 1;
if (hasQueryStrings)
Finally, when everything is in place go to: protected override void OnLoad(EventArgs e) in BlogBasePage.cs and add call to AddCanonical() which I did just after AddMetaContentType().
Hope that this helps.

New version 4.6.2 just published

New in version 4.6.2

  • Every control with folders treeview extended to include button to select "Extended network drives" which will give more flexibility when selecting folder location
  • Parameter "Wait XXX seconds on threads to finish" will be used to when finishing document processing to set timeout how long ReplaceMagic will wait to show dashboards and processing results. In case that some documents are still not fully processed they will be reported under AdditionalInformation tab with message "Processing timeout reached...". Those documents can be imported directly from AdditionalInfo tab for separate processing. Default value is 300 seconds.
  • Button to filter extensions for processing renamed from "..." to "Docs filter"
  • Improved messages during processing finalization phase to be more descriptive
  • Included Toggle All button when selecting which Document Properties should be included in search&replace
  • Changed that when user goes directly to Search&Replace (instead of first doing Scan Documents) ReplaceMagic is doing Ultra fast scan and then Search&Replace. This will accelerate direct replacement process.
  • Added tooltips to some controls in Scan Documents tab
  • Extended result grids to support direct document opening when user does double-click on some file in result grids
  • Added feature "Active Documents" which will tell you which exactly documents are currently processed. This works for scan and replacement process.

  • In case that you want to stop processing of some document just do double click on filename in Active Documents form
  • Added parameter "Maximum document processing time" with default value of 180 seconds. If ReplaceMagic does not have enough free processes to run scan or replacement process all documents that are opened longer than timeout value will be stopped and reported in Additional Info tab.

  • Added question "Are you sure that you want to start replacement?" before you set ReplaceMagic to execute replacement process. This warning can be switched-off by selecting parameter "Suppress Warnings" in Configuration.
  • When replacement process is running you will see process mode (Preview or Execute mode)

  • Changed parameter "% of memory used by ReplaceMagic" to check total available memory instead memory used by ReplaceMagic. New parameter name "% of memory used when running ReplaceMagic". In case that you set this parameter to 90 and total used memory is above that value ReplaceMagic will not open new documents until memory is not below this parameter. Memory reduction can happen if document processing is done and memory is released or "Maximum document processing time" parameter value is reached and ReplaceMagic stops processing affected document(s)

  • Minor bugs fixing