I had a need to do a load of redirects when migrating a site from one platform to Umbraco 13.
Here is how I handled the issue by using middleware and a csv file.
The CSV file was created by a client and would be updated / maintained by them so it made sense to use that as the "source of truth".
The CSV file looks a bit like this :
/old-page,/new-page
/another-old-page,/another-new-page
The CSV file is saved on the root of my solution for ease of access.
The Middleware code, which is saved in a file called RedirectMiddleware.cs
looks like this:
namespace MySite.Web.Infrastructure.Middleware
{
public class RedirectMiddleware
{
private readonly RequestDelegate _next;
private readonly Serilog.ILogger _logger;
private readonly Dictionary<string, string> _redirects;
public RedirectMiddleware(RequestDelegate next, Serilog.ILogger logger)
{
_next = next;
_logger = logger;
_redirects = LoadRedirects();
}
public async Task InvokeAsync(HttpContext context)
{
if (_redirects.TryGetValue(context.Request.Path.Value, out var targetUrl))
{
_logger.Information($"Redirecting from {context.Request.Path} to {targetUrl}");
context.Response.Redirect(targetUrl, true);
return;
}
await _next(context);
}
private Dictionary<string, string> LoadRedirects()
{
var redirects = new Dictionary<string, string>();
var filePath = Path.Combine(Directory.GetCurrentDirectory(), "redirects.csv");
if (File.Exists(filePath))
{
var lines = File.ReadAllLines(filePath);
foreach (var line in lines)
{
var parts = line.Split(',');
if (parts.Length == 2)
{
redirects[parts[0].Trim()] = parts[1].Trim();
}
}
}
return redirects;
}
}
}
and then in my Startup.cs or Program.cs I just added the Middleware like :
app.UseMiddleware<RedirectMiddleware>();
And that is it. When I hit /old-page
I am redirected to /new-page
(as long as it exists, if it doesn't then I will still get a 404 error.
One thing to note, this is using Serilog.ILogger as it's within an Umbraco 13 site and this allows me to save to the log files within Umbraco.