Skip to content

Instantly share code, notes, and snippets.

@skttl
Created August 2, 2017 11:39
Show Gist options
  • Save skttl/a1ad852ea094e8dd4a7c80d87fefb857 to your computer and use it in GitHub Desktop.
Save skttl/a1ad852ea094e8dd4a7c80d87fefb857 to your computer and use it in GitHub Desktop.
Migrate from 301 Url Tracker to Skybrud.Umbraco.Redirects

This is a script that can help you migrate your redirects from 301 Url Tracker to Skybrud.Umbraco.Redirects.

The script is dependent on two pull requests I made (enabling regex'es and forwarding of query strings).

using InfoCaster.Umbraco.UrlTracker.Models;
using Skybrud.Umbraco.Redirects.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Http;
using umbraco.BusinessLogic;
using umbraco.DataLayer;
using Umbraco.Web.WebApi;
public class MigrateUrlTrackerToRedirectsController : UmbracoApiController
{
[HttpGet]
public List<RedirectItemRow> Migrate()
{
List<UrlTrackerModel> urlTrackerEntries = new List<UrlTrackerModel>();
List<IParameter> parameters = new List<IParameter>();
string query = "SELECT * FROM icUrlTracker WHERE Is404 = 0"; // remove where clause, if you want to add 404 records too.
using (IRecordsReader reader = Application.SqlHelper.ExecuteReader(query, parameters.ToArray()))
{
while (reader.Read())
{
urlTrackerEntries.Add(new UrlTrackerModel(reader.GetInt("Id"), reader.GetString("OldUrl"), reader.GetString("OldUrlQueryString"), reader.GetString("OldRegex"), reader.GetInt("RedirectRootNodeId"), reader.Get<int?>("RedirectNodeId"), reader.GetString("RedirectUrl"), reader.GetInt("RedirectHttpCode"), reader.GetBoolean("RedirectPassThroughQueryString"), reader.GetBoolean("ForceRedirect"), reader.GetString("Notes"), reader.GetBoolean("Is404"), reader.GetString("Referrer"), reader.GetDateTime("Inserted")));
}
}
urlTrackerEntries = urlTrackerEntries.Where(x => x.RedirectNodeIsPublished).ToList();
//var entries = UrlTrackerRepository.GetUrlTrackerEntries(showAutoEntries: false);
var rows = new List<RedirectItemRow>();
foreach (var entry in urlTrackerEntries)
{
var row = new RedirectItemRow();
row.Created = entry.Inserted.Ticks;
row.ForwardQueryString = entry.RedirectPassThroughQueryString;
row.IsPermanent = entry.RedirectHttpCode == 301 || entry.RedirectHttpCode == 401;
if (entry.RedirectNodeId != null)
{
var redirectNode = Umbraco.TypedContent(entry.RedirectNodeId);
if (redirectNode != null)
{
row.LinkId = redirectNode.Id;
row.LinkName = redirectNode.Name;
row.LinkUrl = redirectNode.Url;
}
else
{
row.LinkId = (int)entry.RedirectNodeId;
}
}
else
{
row.LinkName = entry.Notes ?? entry.RedirectUrl;
row.LinkUrl = entry.RedirectUrl;
}
var linkmode = entry.RedirectNodeId != null ? RedirectLinkMode.Content : RedirectLinkMode.Url;
row.QueryString = entry.OldUrlQueryString;
row.RootNodeId = Math.Max(0, entry.RedirectRootNodeId);
row.Updated = DateTime.Now.Ticks;
row.IsRegex = !string.IsNullOrEmpty(entry.OldRegex);
row.Url = entry.OldRegex ?? (entry.OldUrl.StartsWith("/") ? "" : "/") + entry.OldUrl;
rows.Add(row);
try
{
RedirectsRepository.Current.AddRedirect(row.RootNodeId, row.Url, new RedirectLinkItem(row.LinkId, row.LinkName, row.LinkUrl, linkmode), row.IsRegex, row.ForwardQueryString);
}
catch(Exception e)
{
// just catch it, in case there a duplicate entries in UrlTracker.
}
}
return rows;
}
}
@SvenGoormans
Copy link

Hello !

Is there by any chance a known script to migrate data from 301 Url Tracker to Skybrud.Umbraco.Redirects (v2.0.4) ?
Thank you !

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment